2012-01-26 8 views
2

SQL Server 2005には、可変数の列を持つテーブルがあります。最初の2つは定数です。 私はテーブルの列の数を取得することができたので、何を数えるかを考えていますが、可変数の列を選択する方法はわかりません。ループで列を選択する

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

私は、各列を取得するためにwhileループを使用する必要があると推測しています。 ご協力いただければ幸いです。おかげさまで

編集: 私は、動的SQLのAFの提案@使用して終了(下記参照)、それを行うには

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には、さまざまな数の列を持つテーブルがあります" - rly? –

+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を使用できます。

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

があなたのケースでは、あなたが最初の選択から列を持つ@cmdを構築する必要があります。

動的SQLはこのようなものです。

+0

ありがとうございます。私はこれを行かせます。 – Greyhound

+1

それは美しく働いた!ありがとうございました。 ' INFORMATION_SCHEMA FROM COLUMN_NAMEをSELECTのVARCHAR(MAX)AS DECLAREの@COL DECLAREのCOLUMN_CURSORカーソルを '選択'= @CMD AS VARCHAR(MAX) SETの@CMDを宣言する。[COLUMNS]は TABLE_NAME = 'SOME_TABLE' OPEN COLUMN_CURSOR が@COL INTO NEXT COLUMN_CURSOR FROM WHILE @@ FETCH_STATUS = 0 をFETCH は が \t @COL = 'STATIC_COL1' の場合 \tが \t SETをBEGIN BEGIN @ CMD = @CMD + @COL \t END \tは \t @COL INTO NEXT COLUMN_CURSOR \tからのフェッチ 'SOME_TABLEから 'SETの@CMD = @CMD + 'CAST(' + @COL + + @COL \t END' INT AS)AS' CLOSE COLUMN_CURSOR DEALLOCATE COLUMN_CURSOR SETの@CMD = @CMD + EXEC(@CMD) ' – Greyhound

関連する問題