2013-08-29 95 views
0

我正在嘗試創建一個存儲過程,該存儲過程將創建一個臨時表A,其列將取決於另一個表B的行數。是我允許用戶創建他們自己的「組」,並且關於組的信息將被存儲在表B中。創建表A將查看錶B中的行數,併爲每個組創建一個列在表B中(使用表B中的組的名稱作爲表A中的列名)。我無法反轉座標軸(座標軸?),因爲行將成爲我係統中每個用戶的輸入,這也是可變的。創建具有可變列數的表的過程

所以總結:我將如何創建一個過程來創建一個具有可變列數的臨時表?

謝謝。

回答

3
DECLARE @sSQL varchar(max), 
    @ColumnName CHAR(128) 

DECLARE TableCursor CURSOR FOR 
    SELECT ColumnName FROM GroupTable 

SET @sSQL = 'CREATE TABLE ##NewTempTable (' 

OPEN TableCursor 

FETCH NEXT FROM TableCursor INTO @ColumnName 

WHILE @@FETCH_STATUS = 0 
BEGIN 

SET @sSQL = @sSQL + RTRIM(@ColumnName) + ' CHAR(10) ,' 

FETCH NEXT FROM TableCursor INTO @ColumnName 

END 

CLOSE TableCursor 

DEALLOCATE TableCursor 

SET @sSQL = @sSQL + ')' 

EXEC (@sSQL) 

SELECT * FROM ##NewTempTable 

我希望這有助於。在DECLARE CURSOR中,您需要將「ColumnName」和「TableName」更改爲您正在查詢的實際列/表。

+0

請不要將簽名添加到您的答案。 – Sumurai8

+0

啊輝煌。這就是我一直在尋找的東西:以字符串的形式運行任意代碼的能力。這麼晚纔回復很抱歉。我唯一需要添加的是@Column變量的幾個驗證/替換語句,以確保我所抽取的數據適合列名(例如,用下劃線替換空格) – user856358

0

您不應該這樣做 - 而是將組名稱作爲表A中的一列。

+0

要清楚,您的解決方案是將表B中的所有組名稱合併到表A中的一列中? SQL中根本沒有辦法爲表A中的表B中的每個組創建單獨的列? – user856358

+0

是的,沒錯。我確信有一種方法可以做到這一點,但與SQL的性質背道而馳的是擁有像這樣的變量表定義,因爲如果不動態地指定列名稱,就很難或不可能編寫查詢。另外想象一下,編寫在不同類別的組上計算度量標準的查詢或將組名上的不同表連接在一起是多麼困難。 – jnylen

+1

構建一個動態的#temp表格也非常麻煩,並且之後也會引用它,因爲一旦您執行了創建它的動態代碼,它就不再存在。因此,所有後續代碼必須位於同一個動態SQL塊內。呸。你確定你需要臨時表嗎?也許而不是問如何完成一個動態創建的臨時表,你問如何解決你試圖解決的實際問題? –

相關問題