连接行(sql server 2000)

问题描述:

使用SQL Server 2000时,我遇到以下问题连接行(sql server 2000)

下表中有大约200行。

 
Company/Employee 
1005/A 
1005/B 
1005/C 
1010/X 
1010/Y 
1020/L 
1020/M 
etc etc 

我希望创建以下(逗号分隔)输出:

 
Company/Employees 
1005/A, B, C 
1010/X, Y 
1020/L, M 
etc etc 

我在SQL Server 2000中一个很艰难的时期这一点,而2005年似乎提供了更简单的解决方案来解决这个问题!我希望有人有一个明智的想法来解释如何解决这个问题...

+0

我甚至没有想过在2005年可能。你是怎么做到的? – 2010-02-09 15:45:36

+0

@David:查看FOR FOR XML条款。 – Quassnoi 2010-02-09 15:47:12

+1

这是SQL Server 2000! – 2010-02-09 16:15:57

我见过在SQL 2000中使用UDF的解决方案,但他们很可怕 - 他们基本上为每个组做一个全新的SELECT可能会执行数百或数千次。实际上,你最好使用光标:

DECLARE @Temp TABLE 
(
    Company int NOT NULL PRIMARY KEY, 
    Employees varchar(4000) NOT NULL 
) 

DECLARE 
    @LastCompany int, 
    @Company int, 
    @Employee varchar(100), 
    @Employees varchar(4000) 

DECLARE crEmployee CURSOR FAST_FORWARD FOR 
    SELECT Company, Employee 
    FROM @Tbl 
    ORDER BY Company 
OPEN crEmployee 
FETCH NEXT FROM crEmployee INTO @Company, @Employee 
WHILE (@@FETCH_STATUS = 0) 
BEGIN 
    IF (@LastCompany IS NULL) 
     SET @Employees = @Employee 
    ELSE IF (@Company = @LastCompany) 
     SET @Employees = @Employees + ',' + @Employee 
    ELSE BEGIN 
     INSERT @Temp (Company, Employees) 
     VALUES (@LastCompany, @Employees) 

     SET @Employees = @Employee 
    END 
    SET @LastCompany = @Company 
    FETCH NEXT FROM crEmployee INTO @Company, @Employee 
END 
CLOSE crEmployee 
DEALLOCATE crEmployee 

IF (@Employees IS NOT NULL) 
    INSERT @Temp (Company, Employees) 
    VALUES (@LastCompany, @Employees) 

SELECT * FROM @Temp 

有使用类似于用于计算运行总计临时表和UPDATE一个解决方案,但它是一个野兽看,在大多数情况下不会做性能比光标好得多。

如果有人真的很想看到UPDATE版本,我会发布它,但我建议首先尝试游标版本,看看它是否“足够好”。