如何从表中选择动态列值?

时间:2012-07-27 11:38:59

标签: sql sql-server-2008 sql-server-2005 select

我有一个名为“TableA”的表,其中包含以下记录:

表A:

      ID       Jan       Feb
     ----     -----     -------
      1      '01/12'    '04/12'

这里我想从表中选择任何一个列值。但是列名称被分配给变量。我们不知道确切的列名。

例如:

    Declare @Month VARCHAR(20)
    SET @Month = 'Feb'

    Select @Month from TableA

它给出如下输出:

    'Feb'

但所需的输出是'04 / 12'

如何获得所需的输出?

4 个答案:

答案 0 :(得分:5)

试试这个:

Declare @Month VARCHAR(20)
     SET @Month = QUOTENAME('Feb')
 exec('Select '+@Month+' from TableA')    

答案 1 :(得分:3)

使用UNPIVOT

select months
from TableA
unpivot 
(months for m in (Jan, Feb)) pvt
where m=@month

它比动态SQL更安全,因为它不容易受到SQL注入攻击

答案 2 :(得分:2)

使用EXEC或sp_executesql

EXEC:

Declare @Month NVARCHAR(20)
SET @Month = 'Feb'
DECLARE @SQL NVARCHAR(4000)
SET @SQL = 'Select ' + @Month + ' from TableA'
EXEC(@SQL)

sp_executesql更可取,因为它参数化变量:

DECLARE @SQL NVARCHAR(4000)
SET @SQL = 'Select @Month from TableA'
EXEC sp_executesql @SQL, 
              N'@Month NVARCHAR(20)',
              @Month = 'Feb'

(这只返回常量'Feb' - 列名不能是变量)

答案 3 :(得分:2)

试试这个

Declare @colName VARCHAR(20)
SET @colName = 'Feb'

Exec('select '+ @colName+' from TableA')