2010-06-19 80 views
1

詳細信息表有以下幾列噸-SQL字符串與表列操作

Title First Second Third Fourth Fifth 
------------------------------------------ 
A  null null null null null 


input variable 
-------------- 

@columns = 'Title, Third, Fourth' 

我要生成輸出中的

@allcolumns = 'Title, Third, Fourth, First, Second, Fifth' 

可變@allcolumns將包含詳細信息表但@columns所有列首先,然後是其餘列

因此,例如,如果

@columns = 'Title, Fourth,Fifth' 

然後輸出將是

@allcolumns = 'Title, Fourth, Fifth, First, Second, Third' 

感謝

+0

@column是否包含列的名稱或值不應該被置於@allcolumn的值? – Dewfy 2010-06-19 06:21:48

回答

3

這應該工作:

DECLARE @columns VARCHAR(max); 
DECLARE @allcolumns VARCHAR(max); 

SET @columns = 'Title,Fourth,Fifth'; 
SET @allcolumns = @columns; 

SELECT @allcolumns = @allcolumns + ',' + column_name FROM 
    INFORMATION_SCHEMA.columns WHERE 
    table_name = 'DETAILS' AND 
    CHARINDEX(column_name, @columns) = 0; 

SELECT @allcolumns; 

GO 

另外一個想法:如果你想創建一個SELECT語句來選擇由上面的代碼生成的順序列,你可以這樣做:

DECLARE @sql VARCHAR(max); 
SET @sql = 'SELECT ' + @allcolumns + ' FROM DETAILS'; 
EXEC(@sql); 

...雖然我看不出爲什麼你想這樣做。

+0

這可以用在臨時表上嗎? DETAILS表是一個臨時表。我試過了,但沒有奏效。它基本上返回了@columns。我猜測臨時表可能沒有information_schema中的詳細信息。任何建議? – stackoverflowuser 2010-06-19 06:59:02

+0

我使用了相同的查詢,並將其調整爲臨時表。有用。非常感謝。 – stackoverflowuser 2010-06-19 07:14:56

+0

對不起,我是另外訂婚。我沒有用臨時表來嘗試它。你爲了使它與臨時表一起工作而改變了什麼?這些信息可能對其他人有用。 – Mike 2010-06-19 07:24:43

0

首先,也是最重要的是,爲什麼不乾脆第一至第五返回列,讓調用代碼確定要使用的列?一般的SQL語言不是爲動態列確定和生成而設計的。它假設調用代碼處理應該返回的列的確定。此外,調用代碼從不依賴查詢中的列順序,因此輸出中列的順序應該沒有區別。鑑於此,您應該在中間層組件或報告工具中進行這種類型的操作。

其次,雖然它是可能的爲了解決T-SQL中的這類問題,不應該這樣做。 T-SQL對字符串操作很糟糕。

最後,如果這是您需要構建以從數據庫模式獲取正確信息的查詢類型,則可能需要重新評估數據庫模式。當您開始運行越來越複雜的查詢以檢索您想要的信息時,它表明一個與業務需求脫節的模式。