我有一个使用输入参数@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
答案 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'
)