2012-07-27 68 views
1

我有一个名为“表A”表,该表具有以下记录:如何从表中选择动态列值?

表A:

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

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

例如:

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

    Select @Month from TableA 

它使输出如下:

'Feb' 

但是所期望的输出是'04/12'

如何获得所需的输出?

+1

在你走下动态SQL的路径之前(因为迄今为止的答案都有提示sted),请确保您了解如何避免SQL注入。 – 2012-07-27 11:45:17

+0

你试图解决什么问题?表中有多少行?你打算如何使用桌子?您可以使用exwc('select'+ @month +'from tableA') – Andrew 2012-07-27 11:45:34

回答

2

试试这个

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

Exec('select '+ @colName+' from TableA') 
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' 

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

+1

您需要尝试查询的第二个版本。 – 2012-07-27 11:48:47

+0

谢谢 - 更正。我试图提倡使用参数化来避免SQL注入。 – StuartLC 2012-07-27 11:56:49

5

试试这个:

Declare @Month VARCHAR(20) 
    SET @Month = QUOTENAME('Feb') 
exec('Select '[email protected]+' from TableA')  
3

使用UNPIVOT

select months 
from TableA 
unpivot 
(months for m in (Jan, Feb)) pvt 
where [email protected] 

它比动态SQL更安全的解决方案,因为它是不容易受到SQL注入攻击