动态连接表中的所有列。
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动态连接表中的所有列。相关的知识,希望对你有一定的参考价值。
我在网上搜索了一下,发现一个很好的例子。链接
它是有用的,但我希望输出像:列1值1,列2值2......。
表。
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的。这个例子很简单,其实有几百列。
答案
你可以在你的例子中添加一些简单的代码。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')
另一答案
你可以使用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;
另一答案
你可以使用CONCAT函数和所有文字的每一行。你不需要动态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 |
+----------+------------+
另一答案
试试这个,这里是 演示.
select
concat('id', cast(id as varchar), ',', 'Name', name) as values
from test1;
产量:
| values |
| ------------- |
| id1,NameTom |
| id2,NameJohn |
| id3,NameAlice |
另一答案
SELECT CONCAT('ID',ID,',','NAME',NAME)
FROM TEST1
另一答案
select
stuff((select t.* for xml path(''), type).query('for $n in ./* return textconcat(",", local-name($n),data($n))').value('data(.)', 'nvarchar(max)'), 1, 1, '')
from sys.all_objects /*<-- table name */ as t;
以上是关于动态连接表中的所有列。的主要内容,如果未能解决你的问题,请参考以下文章
如何在SQL Server 2012中动态替换表中的所有值?