2014-02-24 75 views
0

我具有與輸入參數@Instring的VarChar =「1,2,3,4」,這是動態的輸入運行一個程序,填充表@RetTable這樣:樞軸@Table與動態列動態SQL

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

只要你的第二次嘗試返回一個不正確的語法 - 因爲你的列是數字的,那麼你需要用一個方括號包圍每列(即'[1],[2],[3]') – Taryn

回答

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會工作。

+0

I可以使用#table – Allstar

+0

通過使用#Table,我還編寫了一個小函數來分隔@Instring括號之間的所有內容,然後動態SQL工作 – Allstar

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

USE 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' 
)