首页 > 解决方案 > 如何在不创建函数或使用 STRING_SPLIT 函数的情况下拆分分隔字符串

问题描述

需要在不使用STRING_SPLIT函数的情况下拆分代码中的分隔字符串。

这是在以兼容模式 110 (SQL Server 2012) 运行的 SQL Server 2016 中,遗憾的是无法更改。

SELECT
    rsys.Netbios_Name0 As Name,
    (SELECT bg.Name
     FROM vSMS_BoundaryGroup bg
     WHERE bg.GroupID = value) As 'Boundary Group',
    rsys.Full_Domain_Name0 AS Domain
FROM
    v_R_System rsys
INNER JOIN 
    v_GS_BOUNDARYGROUPCACHE bgc ON bgc.ResourceID = rsys.ResourceID
OUTER APPLY 
    STRING_SPLIT(bgc.BoundaryGroupIDs0, ',') 

我收到此错误:

消息 208,级别 16,状态 1,第 1 行
无效的对象名称“STRING_SPLIT”

标签: sqldatabasesql-server-2012sql-server-2016

解决方案


创建了以下函数:

使用 XML 创建一个表值函数,如下所示,它使用 Sql XML 功能来拆分字符串。

CREATE FUNCTION [dbo].StringSplitXML
(
    @String  VARCHAR(MAX), @Separator CHAR(1)
)
RETURNS @RESULT TABLE(Value VARCHAR(MAX))
AS
BEGIN    
 DECLARE @XML XML
 SET @XML = CAST(
    ('<i>' + REPLACE(@String, @Separator, '</i><i>') + '</i>')
    AS XML)

 INSERT INTO @RESULT
 SELECT t.i.value('.', 'VARCHAR(MAX)') 
 FROM @XML.nodes('i') AS t(i)
 WHERE t.i.value('.', 'VARCHAR(MAX)') <> ''

 RETURN
END

下面的例子展示了我们如何使用上面的函数来分割逗号分隔的字符串

SELECT * 
FROM StringSplitXML('Basavaraj,Kalpana,Shree',',')

用我的查询

SELECT
rsys.Netbios_Name0 As Name
, (SELECT
bg.Name
FROM vSMS_BoundaryGroup bg
WHERE bg.GroupID = value) As 'Boundary Group',
rsys.Full_Domain_Name0 AS Domain
FROM v_R_System rsys
INNER JOIN v_GS_BOUNDARYGROUPCACHE bgc ON bgc.ResourceID = rsys.ResourceID
OUTER APPLY StringSplitXML(bgc.BoundaryGroupIDs0, ',') 
order by rsys.Netbios_Name0

谢谢 https://sqlhints.com/tag/split-delimited-string-in-sql/


推荐阅读