(4.28)for xml path 在合并拆分上的作用演示

时间:2024-05-01 12:15:08

for xml path 用于合并与拆分

1、合并

  很多时候需要在SQL Server中创建逗号分隔列表。这可以使用SQL Server的DOR XML PATH功能完成。与select语句一起使用时,FOR XML PATH生成一个xml。其示例如下所示。

1
2
3
4
5
6
DECLARE @tb TABLE(sno int identity,col1 varchar(10))
INSERT INTO @tb VALUES('a'),('b'),('c'),('d')
SELECT ',' + col1 from @tb
for xml path('')

  上面的查询创建了一个表变量,并使用FOR XML PATH对其进行简单的选择。我们案例中的分隔符是“,”。上述查询的输出如下所示。

      (4.28)for xml path 在合并拆分上的作用演示

  我们得到一个逗号分隔列表,但是我们仍然需要摆脱“a”之前的第一个逗号。这可以使用STUFF功能完成,如下所示。

1
2
3
4
5
6
7
8
9
10
11
12
13
DECLARE @tb TABLE(sno int identity,
col1 varchar(10))
INSERT INTO @tb VALUES('a'),('b'),('c'),('d')
SELECT
STUFF(
(SELECT ',' + col1 from @tb
for xml path('')),
1,
1,
''
) AS Comma_separated_list

  上面的查询删除了烦人的“,”并返回以下结果。

      (4.28)for xml path 在合并拆分上的作用演示

2、拆分

  这是将列表转换为表的快速SQL函数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
-- sql function to convert list to table
CREATE FUNCTION fn_listtotable
(
@list nvarchar(max),
@delimeter nvarchar(100)
)
RETURNS @split TABLE
(
sno int identity,
value varchar(max)
)
BEGIN
Declare @xml XML
select @xml = cast('<A>'+ replace(@list,@delimeter,
'</A><A>')+ '</A>' as xml)
INSERT INTO @split      
select t.value('.','varchar') as inVal
from @xml.nodes('/A') as x(t)
RETURN
END

上述查询利用SQL Server的Xquery功能来分割分隔值。该功能可以如下所示使用

    (4.28)for xml path 在合并拆分上的作用演示