【问题标题】:Transpose or pivot SQL @Table转置或旋转 SQL @Table
【发布时间】:2014-03-26 08:05:34
【问题描述】:

我有一个使用动态输入参数@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

然后我想将@RetTable 旋转或转置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 来替换/引用,以便有一个动态过程。我在 SO 上尝试了各种动态 sql 帖子,但每次尝试都遇到问题。有什么想法吗?

编辑:

回复@bluefeet。我尝试过的;

1)

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

结果:error must declare @TempTable - table out of scope

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

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

执行时出现错误:Incorrect syntax near '1'

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

之前我也尝试使用普通的execute 执行,但也尝试使用Exec sp_executesql 执行

【问题讨论】:

  • 第二次尝试返回错误的语法 - 因为您的列是数字,所以您需要用方括号括住每一列(即[1], [2], [3]

标签: sql sql-server


【解决方案1】:

如果你尝试这样做

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 将起作用。

【讨论】:

  • 通过使用#Table,我还编写了一个小函数,将@Instring括号之间的所有内容分隔开来,然后动态SQL工作
【解决方案2】:
DECLARE  @InString varchar(50)='1,2,3,4'

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

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

输出

从@ReturnsTable 中选择 * 枢( 最大(我的退货) For [ID] In (1,2,3,4) As myPTable

当您确定打印正确时,使用EXECUTE 执行它

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

【讨论】:

    猜你喜欢
    • 2021-09-18
    • 1970-01-01
    • 1970-01-01
    • 2021-11-06
    • 2012-07-22
    • 2014-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多