Конкатенация строк (SQL Server 2000) - PullRequest
1 голос
/ 09 февраля 2010

У меня следующая проблема при использовании 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, похоже, предлагает более простые решения для решения этой проблемы! Я надеюсь, у кого-то есть блестящая идея объяснить, как решить эту проблему ...

1 Ответ

0 голосов
/ 09 февраля 2010

Я видел решения, использующие пользовательские функции в SQL 2000, но они пугают - они в основном делают совершенно новые 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, я опубликую ее, но сначала советую попробовать версию курсора и посмотреть, достаточно ли она хороша.

...