2012-07-27 63 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注入攻擊