2016-09-26 42 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

IF([QC] .field_key!=「blank_blank」)不會觸發工作,你必須通過插入表循環,並從inserted表 – GuidoG

+1

這有這樣做的每個更新或插入記錄由於不正確定義的關鍵結構而出現的挑戰。您是否考慮過使用複合鍵而不是將多個數據碎片整理成單個列?你有什麼是違反1NF的,如果任何數據發生變化,可能會超級醜陋。即使你堅持使用這種設計,也不要訴諸循環。這裏沒有任何東西不能在具有左連接和case表達式的單個更新語句中完成。 –

+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

這是你桌子上唯一的鑰匙,最好是主鑰匙。它將觸發器內臨時插入的表(插入或更新的行)與實際更新的表數據進行匹配。 –