1

次のレコードを持つ「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

4 に答える 4

5

これを試して:

Declare @Month VARCHAR(20)
     SET @Month = QUOTENAME('Feb')
 exec('Select '+@Month+' from TableA')    
于 2012-07-27T11:42:10.383 に答える
5

使用するUNPIVOT

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

SQL インジェクション攻撃に対して脆弱ではないため、動的 SQL よりもはるかに安全なソリューションです。

于 2012-07-27T11:44:17.833 に答える
2

EXEC または sp_executesql を使用する

実行:

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' を返すだけです - 列名を変数にすることはできません)

于 2012-07-27T11:41:55.007 に答える
2

これを試して

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

Exec('select '+ @colName+' from TableA')
于 2012-07-27T11:42:04.217 に答える