通过循环选择列

时间:2012-01-26 10:16:33

标签: sql sql-server sql-server-2005 tsql

我在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循环来获取每一列。 任何帮助,将不胜感激。 感谢。

编辑: 我最终使用了@ aF的动态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)

1 个答案:

答案 0 :(得分: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