连接行(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年似乎提供了更简单的解决方案来解决这个问题!我希望有人有一个明智的想法来解释如何解决这个问题...
答
我见过在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
版本,我会发布它,但我建议首先尝试游标版本,看看它是否“足够好”。
我甚至没有想过在2005年可能。你是怎么做到的? – 2010-02-09 15:45:36
@David:查看FOR FOR XML条款。 – Quassnoi 2010-02-09 15:47:12
这是SQL Server 2000! – 2010-02-09 16:15:57