创建UDF将行拆分为以逗号分隔的单列

时间:2018-10-10 10:38:51

标签: sql-server tsql sql-server-2008

在下面的示例数据中,我想使用UDF将行拆分为列。

CREATE TABLE ##temp
([date] datetime,
    category varchar(3),
    amount money)
insert into ##temp values ('1/1/2012', 'ABC', 1000.00)
insert into ##temp values ('2/1/2012', 'DEF', 500.00)
insert into ##temp values ('2/1/2012', 'GHI', 800.00)
insert into ##temp values ('2/10/2012', 'DEF', 700.00)
insert into ##temp values ('3/1/2012', 'ABC', 1100.00);

我在下面创建函数

CREATE FUNCTION dbo.Splitter(@Name NVARCHAR(MAX))
RETURNS VARCHAR(MAX)
AS
BEGIN
DECLARE @cols AS NVARCHAR(MAX)
SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(@Name) 
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')
RETURN @cols
END

当前输出

CatSplit
[ABC]
[DEF]
[GHI]
[DEF]
[ABC]

我想要的是(预期输出)

         CatSplit
[ABC],[DEF],[GHI],[DEF],[ABC]

1 个答案:

答案 0 :(得分:3)

为什么在这里需要功能,而无需使用功能就可以做到:

SELECT STUFF((SELECT  ',' + QUOTENAME(t.category ) 
              from #temp t
              FOR XML PATH(''), TYPE
             ).VALUE('.', 'NVARCHAR(MAX)'), 1, 1, ''
            ) AS CatSplit

编辑:如果您将其用作列名进行透视或其他操作,则可以定义一个变量并在代码中的任何地方使用它,而无需使用函数。

DECLARE @cols AS NVARCHAR(MAX)

SELECT @cols = STUFF((SELECT  ',' + QUOTENAME(t.category ) 
                      FROM #temp t
                      FOR XML PATH(''), TYPE
                     ).VALUE('.', 'NVARCHAR(MAX)'), 1, 1, ''
                    )