2017-06-27 9 views
0

私はこれで困っています。私は次のコードを更新ステートメントの最後の@POC_XLATEの時点までうまく動作させてから、エラーを取得しなければなりません。これはSCALAR VARIABLEを宣言しなければなりません。 テーブルを一時テーブルに変更すると、コードは正常に動作します。私はselect文をコードの最後に移動しようとしましたが、それはうまくいきませんでした。誰かがなぜこれをやっているのかについていくつかの提案があることを願っています。前もって感謝します。スカラー変数のエラーはvarテーブルを使用していますが、温度テーブルはありません

declare @POC_XLATE as TABLE(
    POC_XLATE_ID int NULL, 
    TAR_ID int NULL, 
    POC_USERID varchar(50) NULL, 
    ACTION_DATE datetime NULL 
) 
insert into @POC_XLATE(POC_XLATE_ID, TAR_ID, POC_USERID, ACTION_DATE) 
select * from POC_XLATE 
where POC_XLATE.ACTION_DATE is null 

select * from @POC_XLATE 

update @POC_XLATE 
set ACTION_DATE = TAR_DATA.OPEN_DATE 
from TAR_DATA 
where @POC_XLATE.TAR_ID = TAR_DATA.TAR_ID 

答えて

1

カラムエイリアスは、@で開始できません。これは、宣言されたスカラー変数の記号です。そのため、表の別名を使用します。

update p 
    set ACTION_DATE = td.OPEN_DATE 
    from @POC_XLATE p JOIN 
      TAR_DATA td 
      on p.TAR_ID = td.TAR_ID ; 

をしかし、なぜ、あなたは、2つのステップでクエリを書くのでしょうか?

insert into @POC_XLATE(POC_XLATE_ID, TAR_ID, POC_USERID, ACTION_DATE) 
    select p.POC_XLATE_ID, p.TAR_ID, p.POC_USERID, td.OPEN_DATE 
    from POC_XLATE p left join 
     TAR_DATA td 
     on p.TAR_ID = td.TAR_ID 
    where p.ACTION_DATE is null; 

1ステップは2よりもはるかにクリーンです。

+0

実際のテーブルを更新する前に正しいデータが転送されているかどうかをチェックするこの方法。更新ステートメントの@POC_XLATEは、テーブルのスカラー変数を宣言する必要があると伝えています。すでに宣言されています。だからなぜ表を再宣言しなければならないのですか? @ tcmauldin。 – tcmauldin

+0

。 。 SQL Serverが '@'で始まる変数を渡すと、ほとんどの状況では変数が*スカラー変数であるとみなされます。 *スカラー変数が存在しない場合、実行は失敗します。例外は、テーブル変数が許される 'FROM'節にあります。 –

関連する問題