动态连接表中的所有列。

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中动态替换表中的所有值?

Laravel - 使用 Join 语句更新表中的所有列

oracle sql中的动态列

使用 pyspark 数据框中的复制名称加入后使用左表中的所有列进行分组

Oracle:动态设置表中的所有 NOT NULL 列以允许 NULL