Pivot @Table with Dynamic Columns Dynamic SQL

时间:2014-02-24 15:10:23

标签: sql sql-server

我有一个使用输入参数@Instring VarChar ='1,2,3,4'运行的程序,它是动态输入,填充表@RetTable:

myDates     myReturns   ID
2012-05-02  0.020       1
2012-05-03  -0.017      1
2012-05-04  -0.026      1
2012-05-02  0.009       2
2012-05-03  0.004       2
2012-05-04  -0.003      2
2012-05-02  -0.003      3
2012-05-03  -0.005      3
2012-05-04  -0.003      3
2012-05-02  0.004       4
2012-05-03  0.010       4
2012-05-04  -0.021      4

然后,我希望通过ID列将此表透视,如下所示:

myDates      1        2       3       4
2012-05-02  0.020   0.009   -0.003  0.004
2012-05-03  -0.017  0.004   -0.005  0.010
2012-05-04  -0.026  -0.003  -0.003  -0.021

我的代码转换现在看起来像这样:

Select * From @ReturnsTable
Pivot(Max(myReturns) For [ID] In ([1],[2],[3],[4])) As myPTable

这部分代码:

([1],[2],[3],[4]))

我想用/替换/引用@InString以获得动态过程。我已经在Stack上尝试过各种动态sql帖子,但是每次尝试都会遇到问题。有什么想法吗?

编辑:

回答@bluefeet。我尝试了什么;

1)

Execute
('Select * From @TempTable
Pivot(Max(myReturns) For ID In (' + @InString + ')) As myPTable')

结果:错误必须声明@TempTable - 表超出范围

2)然后将@TempTable改为#TempTable; 打印为:

Select * From #TempTable
Pivot(Max(myReturns) For ID In (1,2,3)) As myPTable

执行时,我收到错误:'1'附近的语法不正确

这让我认为ID应该被分隔为[1],[2],[3] ..

之前我也尝试过执行正常执行,还有exec sp_executesql

2 个答案:

答案 0 :(得分:2)

如果您尝试这样做

declare @sql nvarchar(1000) = 'Select * From @ReturnsTable Pivot(Max(myReturns) For [ID] In (' 
     + @InString+ ') As myPTable'

exec sp_executesql @sql

无效

这是因为您的@returnsTable属于您的代码范围,您的动态SQL将位于不同的范围内。如果要将表变量传递给动态SQL,则需要将其设置为已定义的类型,并将其作为参数传递。

请参阅using Table variable with sp_executesql

如果您可以使用临时#table而不是表变量,则动态SQL将起作用。

答案 1 :(得分:1)

DECLARE  @InString varchar(50)='1,2,3,4'

首先使用Print语句,以确认您正在动态执行正确的查询

PRINT 
'Select * From @ReturnsTable 
Pivot(
Max(myReturns) 
For [ID] In (' + @InString+ ') As myPTable'

输出

Select * From @ReturnsTable 
Pivot(
Max(myReturns) 
For [ID] In (1,2,3,4) As myPTable

如果您确定打印正确,请使用EXECUTE

执行
EXECUTE(
'Select * From @ReturnsTable 
Pivot(
Max(myReturns) 
For [ID] In (' + @InString+ ') As myPTable'
)