2012-01-26 44 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