2016-09-26 4 views
0

「バインドすることができなかった」私はトリガーを書いたが、私はエラーを取得:IFとトリガーとSQL ServerでのJOINは

Msg 4104, Level 16, State 1, Procedure quest_field_key_af, Line 5
The multi-part identifier "query_creator.field_key" could not be bound.

これは動作するはずですが、それはほとんどcompliteだと私はどのように任意のアイデアを持っていませんそれを修正する。

CREATE TRIGGER SAMPLE_NAME 
ON [dbo].[QC] 
AFTER INSERT, UPDATE 
AS 
    IF ([QC].field_key != 'blank_blank') 
    BEGIN 
     UPDATE [dbo].[CQ] 
     SET [CQ].quest_field_key = (CONVERT(NVARCHAR(8), [CQ].quest_id)+'_'+RIGHT('000'+ CAST([CF].field_no AS VARCHAR(3)),3)) 
     FROM dbo.query_creator 
     INNER JOIN query_field ON [CQ].field_key = [CF].field_key 
     WHERE [QC].status = 1 
    END 
    ELSE 
    BEGIN 
     UPDATE [dbo].[QC] 
     SET quest_field_key = (CONVERT(NVARCHAR(8), [QC].quest_id)+'_'+RIGHT('000'+ CAST(no AS VARCHAR(3)),3)+'b') 
     FROM dbo.QC 
END; 

私はそれを修正するか、私に役立つ他のもののアイデアを教えてください。

+0

([QC] .field_key!=「blank_blank」)はトリガーでは動作しません場合は、挿入されたテーブルをループしており、挿入されたテーブル – GuidoG

+1

から各更新または挿入されたレコードのためにこれを行う。これは持っています不適切に定義されたキー構造に起因する課題である外観。複数のデータをこのように1つの列に分割する代わりに、複合キーを使用することを検討しましたか?あなたが持っているものは1NFに違反しており、データが変更された場合に対処するために非常に醜いことがあります。このデザインに固執していても、このためにルーピングに頼らないでください。ここでは、left joinとcase式を持つ単一のupdate文では実行できないものはありません。 –

+0

あなたは私に何をお勧めしますか? – JaNieWiem

答えて

0

これは必要なものに近いはずです。 ifコードのロジックに基づいて挿入されたレコードを更新します。

CREATE TRIGGER SAMPLE_NAME 
ON [dbo].[QC] 
AFTER INSERT, UPDATE 
AS 
    Update QC Set [CQ].quest_field_key = 
      Case When [QC].field_key != 'blank_blank' And [QC].status = 1 Then CONVERT(NVARCHAR(8), [CQ].quest_id)+'_'+RIGHT('000'+ CAST([CF].field_no AS VARCHAR(3)),3) 
       Else CONVERT(NVARCHAR(8), [QC].quest_id)+'_'+RIGHT('000'+ CAST(no AS VARCHAR(3)),3)+'b' 
       End 
     From [dbo].[QC] 
     INNER JOIN query_field QF ON [QC].field_key = [QF].field_key 
     INNER JOIN inserted I On I.(your match key) = QC.(your match key) 

END; 
+0

どうすればいいですか(マッチキー)? – JaNieWiem

+0

テーブル上の一意のキーです。好ましくはプライマリキーです。トリガ内の一時的な挿入されたテーブル(挿入または更新された行)と、更新された実際のテーブルデータとが一致します。 –