2016-10-19 3 views
1

これは私のコードです。 HEADER_IDは主キーです。 EFFECTIVE_DATEは列名であり、一意の値を含みます。 パラメータとして列名を渡すと、クエリの出力が正しく表示されない

declare @ColumnName varchar(20) 
    set @ColumnName='EFFECTIVE_DATE' 
    select * into #temphdrid 
    from EMP_HEADER a 
    where 
    EMPLOYEE_ID in ('1111','2222') and 
    HEADER_ID=(select max(HEADER_ID) from EMP_HEADER b where 
    a.HEADER_ID=b.HEADER_ID and @ColumnName=(select MAX(@ColumnName) from EMP_HEADER c 
    where b.EMPLOYEE_ID=c.EMPLOYEE_ID and YEAR(FIN_START_DATE)=2016) 
    and YEAR(FIN_START_DATE)=2016) 
    and YEAR(FIN_START_DATE)=2016 

私はそれが10行を示している代わりEFFECTIVE_DATEの@ColumnNameを通過しています、しかし、それは、この場合の各従業員、すなわち2ための単一の行を示すべきです。

EFFECTIVE_DATEを直接渡していれば正しく動作しています。

私は正確な問題が何であるか理解できませんのでお手伝いください。

+0

ここでは大括弧が誤って配置される可能性があるため、@ CRLName =(MAX(@ColumnName)from EMP_HEADER c' –

答えて

4

ロングストーリーショート:あなたがしようとしていることはできません。あなたのアプローチを修正する必要があります。

変数@ColumnNameを宣言すると、列名として解釈されません。それは常にデータ値として解釈されます - あなたの場合、'EFFECTIVE_DATE'文字列リテラルと同じです。次のようにそれが書かれたかのように効果的に、あなたのクエリが動作します。

select * into #temphdrid 
from EMP_HEADER a 
where 
EMPLOYEE_ID in ('1111','2222') and 
HEADER_ID=(select max(HEADER_ID) from EMP_HEADER b where 
a.HEADER_ID=b.HEADER_ID 
and 'EFFECTIVE_DATE'=(select MAX('EFFECTIVE_DATE') from EMP_HEADER c 
where b.EMPLOYEE_ID=c.EMPLOYEE_ID and YEAR(FIN_START_DATE)=2016) 
and YEAR(FIN_START_DATE)=2016) 
and YEAR(FIN_START_DATE)=2016 

これは文法的に正しいですが、MAX('EFFECTIVE_DATE')は常に'EFFECTIVE_DATE'に等しいので、それは、意味がありません。

別のアプローチは、列名を選択する必要があるもののために、いくつかの指標を提供することになる、との比較のためcase式を使用して:

declare @ColIdx tinyint 
set @ColIdx=1 
... 
where 
a.HEADER_ID=b.HEADER_ID 
and (case @ColInd when 1 then EFFECTIVE_DATE when 2 then END_DATE else null end)=(select MAX(case @ColInd when 1 then EFFECTIVE_DATE when 2 then END_DATE else null end) from 
+0

解決に感謝しています。完璧に動作しています – Shardul

+0

@Shardulよろしくお願いします。この質問のヘルプをもう探していない場合は、その横のチェックマークをクリックして回答を受け入れることを検討してください。あなたの問題が解決されたことを知っていて、Stack Overflowで新しいバッジを得ることができます。 – dasblinkenlight

1

動的なクエリはあなたが別の合格しようとしている場合、唯一の方法がありますその変数の列名

declare @ColumnName varchar(20) 
    set @ColumnName='EFFECTIVE_DATE' 

Declare @sql varchar(max) = '' 
set @ColumnName=QUOTENAME(@ColumnName) 

    set @sql = ' select * into #temphdrid 
    from EMP_HEADER a 
    where 
    EMPLOYEE_ID in ('1111','2222') and 
    HEADER_ID=(select max(HEADER_ID) from EMP_HEADER b where 
    a.HEADER_ID=b.HEADER_ID and '+ @ColumnName +' =(select MAX('+ @ColumnName +') from EMP_HEADER c 
    where b.EMPLOYEE_ID=c.EMPLOYEE_ID and YEAR(FIN_START_DATE)=2016) 
    and YEAR(FIN_START_DATE)=2016) 
    and YEAR(FIN_START_DATE)=2016' 

Exec (@sql) 

注:ダイナミッククエリ内に作成一時テーブルは、外部アクセスすることはできません。外部にアクセスして事前にテーブルを作成し、動的クエリ内にを使用したい場合は

+0

ColumnNameの型を 'SYSNAME'にするのがベストです(sysnameデータ型はテーブルの列、変数、オブジェクト名を格納する) –

+0

@TT。 - ** NOTE ** –

+0

また、 'INSERT ... INTO ## temphdrid'も可能です。 –

関連する問題