将 SQL 代码(作为字符串)转换为表 - 动态数据透视

Posted

技术标签:

【中文标题】将 SQL 代码(作为字符串)转换为表 - 动态数据透视【英文标题】:Convert SQL code (as string) into table - dynamic pivot 【发布时间】:2021-03-09 07:01:27 【问题描述】:

我使用下面的 SQL 脚本来执行动态数据透视。我想使用结果在另一个表上左连接,但“INTO”方法似乎不适用于表变量@query。它显示一个错误:

必须声明表变量“@query”

如果我像这样直接加入表:LEFT JOIN @query。 我应该如何保存@query 以便在另一个表上左连接?谢谢!

create table temp
(
    date datetime,
    category varchar(3),
    amount money
)

insert into temp values ('1/1/2012', 'ABC', 1000.00)
insert into temp values ('2/1/2012', 'DEF', 500.00)
insert into temp values ('2/1/2012', 'GHI', 800.00)
insert into temp values ('2/10/2012', 'DEF', 700.00)
insert into temp values ('3/1/2012', 'ABC', 1100.00)


DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX);

SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.category) 
            FROM temp c
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT date, ' + @cols + ' from 
            (
                select date
                    , amount
                    , category
                from temp
           ) x
            pivot 
            (
                 max(amount)
                for category in (' + @cols + ')
            ) p '


execute(@query)

drop table temp

【问题讨论】:

你的术语是错误的,'表变量'存在并且是别的东西,你没有使用任何东西。您正在使用“动态 sql”。 感谢您的提醒。我认为这是一个表变量,因为当我尝试加入 @query 时,我不断收到错误消息“必须声明表变量 @query”。 不要为明显不涉及的数据库产品添加标签。 @a_horse_with_no_name 很抱歉造成混乱。 @query 只是一个字符串(可以传递给执行函数以作为 SQL 代码运行)。您也许可以重写该字符串以包含您的联接或创建可以联接的表。 【参考方案1】:

我明白了。解决方案是在字符串sql脚本中添加##result如下:

set @query = 'SELECT date, ' + @cols + ' ##result from 
            (
                select date
                    , amount
                    , category
                from temp
           ) x
            pivot 
            (
                 max(amount)
                for category in (' + @cols + ')
            ) p '

select * from ##result

【讨论】:

以上是关于将 SQL 代码(作为字符串)转换为表 - 动态数据透视的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server:将 XML 数据转换为表

存储过程:将表名转换为表变量

SQL Server - 将标量函数转换为表值函数

将 XML 转换为表 SQL Server 2005

如何使用 DB2 sql 代码动态地将列转置为表的行,其中列可能会随着时间的推移而增加且无需更改代码?

如何在 json 根节点中添加键值对并使用 SQL Server 将其转换为表