Динамически объединить все столбцы в таблице - PullRequest
1 голос
/ 08 мая 2020

Я искал в Inte rnet и нашел хороший пример: link

Это полезно, но мне нужен результат вроде: column1value1, column2value2 ...

таблица:

create table test1(id int, name varchar(10))
insert into test1 values(1,'Tom'),(2,'John'),(3,'Alice')
select * from test1

Я пробовал:

declare @s varchar(max)
SELECT @s =  ISNULL( @s+ ')' +'+'',''+ ','') + 'convert(varchar(50), ' + c.name    FROM 
       sys.all_columns c join sys.tables  t 
       ON  c.object_id = t.object_id
WHERE t.name = 'test1'

EXEC( 'SELECT '' ''+' + @s + ')+' + ''' '' FROM test1')

результат:

1,Tom
2,John
3,Alice

Но мне нужен результат:

id1,NameTom
id2,NameJohn
id3,NameAlice

Как я могу переписать свой запрос? Я SQL Server 2019. Пример простой, на самом деле есть сотни столбцов.

Ответы [ 6 ]

1 голос
/ 08 мая 2020

Для этого можно использовать методы XML, но при этом будут накладные расходы на производительность

SELECT T.*, Ccat
FROM test1 T
cross apply
(SELECT T.* FOR XML PATH('row'), ELEMENTS, TYPE) CA1(X)
    CROSS APPLY
(
    SELECT STRING_AGG(N1.n.value('local-name(.)' , 'sysname') + N1.n.value('.' , 'nvarchar(4000)'), ',') AS Ccat
    FROM CA1.X.nodes('/row/*') N1(n)
    GROUP BY()
) CA2;
1 голос
/ 08 мая 2020

Вы можете просто добавить немного кода в свой пример: CHAR (39) + c .name + CHAR (39) + '+

Таким образом, окончательный код будет выглядеть так:

    create table test1(id int, name varchar(10))
    insert into test1 values(1,'Tom'),(2,'John'),(3,'Alice')
    select * from test1


    declare @s varchar(max)
    SELECT @s =  
        ISNULL( @s+ ')' +'+'',''+ ','') + CHAR(39) + c.name + CHAR(39) + ' + convert(varchar(50), ' + c.name    
    FROM  sys.all_columns c join sys.tables  t 
           ON  c.object_id = t.object_id
    WHERE t.name = 'test1'

    EXEC( 'SELECT '' ''+' + @s + ')+' + ''' '' FROM test1')
0 голосов
/ 08 мая 2020
select 
stuff((select t.* for xml path(''), type).query('for $n in ./* return text{concat(",", local-name($n),data($n))}').value('data(.)', 'nvarchar(max)'), 1, 1, '')
from sys.all_objects /*<-- table name */ as t;
0 голосов
/ 08 мая 2020
SELECT CONCAT('ID',ID,',','NAME',NAME) 
FROM TEST1
0 голосов
/ 08 мая 2020

Вы можете использовать функцию CONCAT и весь литерал для каждой строки. Вам не нужна динамика c SQL.

DECLARE @test1 table(id int, name varchar(10))
insert into @test1 values(1,'Tom'),(2,'John'),(3,'Alice')
select concat('id',id) AS IdColumn, CONCAT('name',name) as namecolumn from @test1
+----------+------------+
| IdColumn | namecolumn |
+----------+------------+
| id1      | nameTom    |
| id2      | nameJohn   |
| id3      | nameAlice  |
+----------+------------+
0 голосов
/ 08 мая 2020

Попробуйте, вот демонстрация .

 select
  concat('id', cast(id as varchar), ',', 'Name', name) as values
from test1;

Вывод:

| values        |
| ------------- |
| id1,NameTom   |
| id2,NameJohn  |
| id3,NameAlice |
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...