如何用表变量动态转轴?

时间:2015-09-21 03:52:51

标签: tsql variables

我有一个名为:@ table2的表变量,其中包含...

col1 -- col2
id   -- 101
name -- Banana
age  -- 20
id   -- 102
name -- Pudding
age  -- 21

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(@trial2.col1) 
            FROM @trial2 
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT *, ' + @cols + ' from ( select * from @trial2 ) x pivot ( max(col2) for col1 in (' + @cols + ') ) p ORDER BY p.s' execute(@query)


我有这个错误:“必须声明标量变量”@ trial2“”,行“select @cols = STUFF((SELECT distinct','+ QUOTENAME(@ trial2.col1)”) 但是当我将“@ trial2.col1”更改为“col1”时,另一个错误提示:“必须声明表变量”@ trial2“”,你能帮我解决一下吗?

1 个答案:

答案 0 :(得分:0)

查询运行正常,UNTIL你执行生成的SQL。此查询的结果:

DECLARE @cols AS NVARCHAR(MAX)
DECLARE @query AS NVARCHAR(MAX)
DECLARE @trial2 table( col1 varchar(100) NOT NULL , col2 varchar(100) NOT NULL )

INSERT INTO @trial2    ([col1], [col2])
VALUES     ('id', '101'),('name', 'Banana'),('age', '20'),('id', '102'),('name', 'Pudding'),('age', '21')

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(t.col1) 
            FROM @trial2 t
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')


set @query = 'SELECT *, ' + @cols + ' from 
            (
                select *
                from @trial2 t
           ) x
            pivot 
            (
                max(col2)
                for col1 in (' + @cols + ')
            ) p 
            ORDER BY p.s'

select(@query)

是:

SELECT *, [age],[id],[name] from ( select * from @trial2 t ) x pivot ( max(col2) for col1 in ([age],[id],[name]) ) p ORDER BY p.s

问题是,在执行该字符串时,@ trial2不存在。我认为您应该将该表变量保存到临时表(#trial2)中,然后您可以期望动态SQL找到所需的表。

此外,您不应该在最终查询中尝试使用'SELECT *,'+ @cols,实际上您不应该依赖任何生产代码中的select *。

另见这个sqlfiddle:http://sqlfiddle.com/#!6/68b32/592