CSV в SqlServer 2005 - PullRequest
       3

CSV в SqlServer 2005

0 голосов
/ 10 января 2011

у меня есть стол

колонки: Название, роль, Dept

Человек может иметь много ролей. Поэтому при получении данных я хочу, чтобы столбец ролей был в CSV, если у человека более одной роли.

 Name Role          Dept 
 jose Role1,Role2   PWD

При условии, что все остальные детали, кроме ролей для записей, одинаковы.

Спасибо

Ответы [ 3 ]

1 голос
/ 10 января 2011

Это поможет вам.

select
    t3.Name,
    left(t3.Roles, len(t3.Roles)-1) as Roles,
    t3.Dept
from
    (select
            t2.Name,
            t2.Dept,
            (select t1.[Role] + ','
             from Table1 as t1
             where
                t1.Name = t2.Name and
                t1.Dept = t2.Dept
             order by t1.[Role]
             for xml path('')) as Roles
        from Table1 as t2
        group by t2.Name, t2.Dept) as t3

Это взято из первого примера в " Методы XML черного ящика " с этой страницы https://www.simple -talk.com/sql/t-sql-programming/concatenating-row-values-in-transact-sql/

Внутренний запрос создает список ролей в виде XML.Параметр xml path ('') пуст, и поэтому вы не получаете разметку xml, а только список через запятую.

Внешний запрос предназначен только для удаления запятой в конце каждой строки.

Group by t2.Name, t2.Dept гарантирует, что вы получите только одну строку для каждой уникальной комбинации Name + Dept.

0 голосов
/ 10 января 2011

Один из вариантов - сделать это с помощью рекурсивного параметра и курсора.Попробуйте выполнить этот запрос:

DECLARE @Name varchar(50), @Role varchar(MAX), @Dept varchar(50)

DECLARE role_cursor CURSOR FOR 
SELECT  Name,min(Dept)
FROM    [dbo].[Table_1]
group by Name

OPEN role_cursor;
FETCH NEXT FROM role_cursor 
INTO @Name, @Dept

WHILE @@FETCH_STATUS = 0
BEGIN
    set     @Role = ''
    select  @Role = @Role+[Role]+','
    FROM    [dbo].[Table_1]
    where   Name=@Name

    select  @Name,left(@Role,len(@Role)-1),@Dept

    FETCH NEXT FROM role_cursor 
    INTO @Name, @Dept
END
CLOSE role_cursor;
DEALLOCATE role_cursor;

Получив его, вы можете использовать вставку перед выбором, чтобы вставить значения в таблицу результатов

0 голосов
/ 10 января 2011

Вы можете создать определяемую пользователем статистическую функцию , которая создает список значений через запятую и может использоваться в запросах как любая другая статистическая функция (например, MIN, MAX, * 1005).* и т. д.)

Вот соответствующий пост из моего блога: Пользовательский агрегат SQL CLR - примечания по созданию и отладке

После создания dbo.Concat Функция, вы сможете выполнить следующий запрос:

SELECT
  Name
, Dept
, dbo.Concat(Role) AS Roles
FROM dbo.Table_1
GROUP BY
  Name
, Dept

Я использовал его в производственной среде в течение нескольких лет, и его производительность действительно хорошая, даже с большим количеством обработанных строк.

...