游标的替代方法是将多个值非规范化为一列?

时间:2012-10-02 03:32:06

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

  

可能重复:
  SQL Server: Can I Comma Delimit Multiple Rows Into One Column?
  SQL Query to get aggregated result in comma seperators along with group by column in SQL Server

我有一张类似的表:

DocumentID      Name
1           Jack D'Souza
1           Rick Astley
1           Frankestein
1           Einstein

我想编写一个SQL Server标量函数,它将在参数中接受DocumentID并给出CSV分隔值。所以,如果我传入1,它会给Jack D'Souza, Rick Astley, Frankestein, Einstein

在函数内部,我可以在游标中创建并创建此CSV列表。但是有没有替代使用游标?

2 个答案:

答案 0 :(得分:3)

看一下这个例子

CREATE FUNCTION MyConcat(@ID INT)
RETURNS VARCHAR(MAX)
AS
BEGIN
  DECLARE @RetVal VARCHAR(MAX)
    SELECT  @RetVal = stuff(
                    (
                        select  ',' + t1.Name
                        from    MyTable t1
                        where   t1.DocumentID = t.DocumentID
                        for xml path('')
                    ),1,1,'') 
    FROM    MyTable t
    WHERE   t.DocumentID = @ID
    GROUP BY t.DocumentID
  RETURN @RetVal
END;

SQL Fiddle DEMO

您还可以创建一个表函数,它将返回您需要的所有值。

这样的东西
CREATE FUNCTION MyConcatTable()
RETURNS @RetTable TABLE(
    [DocumentID] int, 
    [Name] varchar(MAX)
)
AS
BEGIN
    INSERT INTO @RetTable
    SELECT  t.DocumentID,
            stuff(
                    (
                        select  ',' + t1.Name
                        from    MyTable t1
                        where   t1.DocumentID = t.DocumentID
                        for xml path('')
                    ),1,1,'') 
    FROM    MyTable t
    GROUP BY t.DocumentID
  RETURN
END;

SQL Fiddle DEMO

答案 1 :(得分:0)

你可以创建一个CLR聚合函数来执行此操作。快速搜索谷歌找到了这个:

http://www.mssqltips.com/sqlservertip/1691/sql-server-clr-function-to-concatenate-values-in-a-column/

似乎是在VB.Net中,我确定还有其他的例子已经写好了,因为这是一个非常常见的请求