2012-01-26 111 views
2

我在SQL Server 2005中具有可變數量的列的表,前兩個是唯一恆定的列。 我已經設法得到表中的列數,所以我會有什麼數據,但我真的不知道如何選擇可變數量的列。通過循環選擇列

SELECT 
DISTINCT 
COUNT(*) 
FROM 
INFORMATION_SCHEMA.[COLUMNS] 
WHERE 
TABLE_NAME = 'SOME_TABLE' 
AND 
(COLUMN_NAME <> 'STATIC_COL1' AND COLUMN_NAME <> 'STATIC_COL2') 

我猜我需要使用while循環來獲取每列。 任何幫助,將不勝感激。 謝謝。

編輯: 我結束了使用@動態SQL房顫的建議(見下文)

DECLARE @CMD AS VARCHAR(MAX) 
SET @CMD = 'SELECT ' 
DECLARE @COL AS VARCHAR(MAX) 

DECLARE COLUMN_CURSOR CURSOR FOR 
SELECT 
COLUMN_NAME 
FROM 
INFORMATION_SCHEMA.[COLUMNS] 
WHERE 
TABLE_NAME = 'SOME_TABLE' 

OPEN COLUMN_CURSOR 
FETCH NEXT FROM COLUMN_CURSOR 
INTO @COL 
WHILE @@FETCH_STATUS = 0 
BEGIN 

IF @COL = 'STATIC_COL1' 
BEGIN 
SET @CMD = @CMD + @COL 
END 

FETCH NEXT FROM COLUMN_CURSOR 
INTO @COL 

SET @CMD = @CMD + ', CAST(' + @COL +' AS INT) AS ' + @COL 

END 
CLOSE COLUMN_CURSOR 
DEALLOCATE COLUMN_CURSOR 

SET @CMD = @CMD + ' FROM SOME_TABLE' 

EXEC (@CMD) 
+11

「我在SQL Server 2005中有一個表,列數可變」 - 是嗎? –

+1

你能澄清你的最終目標是什麼嗎?你想循環每一列,併爲了什麼目的? – AdaTheDev

+0

@在表格的整個生命週期中,可能... – AakashM

回答

2

一種方式做到這一點:

下選擇給你列的列表:

SELECT 
column_name 
FROM 
INFORMATION_SCHEMA.[COLUMNS] 
WHERE 
TABLE_NAME = 'SOME_TABLE' 
AND 
(COLUMN_NAME <> 'STATIC_COL1' AND COLUMN_NAME <> 'STATIC_COL1') 

由此,您可以構建預期的查詢並使用動態SQL來執行它。

動態SQL是這樣的:

declare @cmd = 'select * from some_table' 
exec(@cmd) 

在你的情況下,你需要構建@cmd從第一選擇列。

+0

謝謝。我會放棄這一點。 – Greyhound

+1

工作很好!謝謝。 'DECLARE @CMD AS VARCHAR(MAX) SET @CMD = 'SELECT' DECLARE @COL AS VARCHAR(MAX) DECLARE COLUMN_CURSOR CURSOR FOR SELECT COLUMN_NAME FROM INFORMATION_SCHEMA 。[COLUMNS] WHERE TABLE_NAME = 'SOME_TABLE' OPEN COLUMN_CURSOR FETCH NEXT FROM COLUMN_CURSOR INTO @COL WHILE @@ FETCH_STATUS = 0 BEGIN \t IF @COL = 'STATIC_COL1' \t BEGIN \t SET @ CMD = @CMD + @COL \t END \t FETCH NEXT FROM COLUMN_CURSOR \t INTO @COL \t SET @CMD = @CMD + 'CAST(' + @COL + 'AS INT)AS '+ @COL \t END CLOSE COLUMN_CURSOR DEALLOCATE COLUMN_CURSOR SET @CMD = @CMD +' FROM SOME_TABLE' EXEC(@CMD)' – Greyhound