2017-02-27 18 views
0

我使用SQL Server 2014,我有以下代碼來創建一個觸發器(它插入數據):如何創建觸發器語句以僅在尚不存在時將值插入到SQL Server表中?

CREATE TRIGGER [dbo].[INSERT_TR_LAB_TESTS_RESULTS] 
ON [dbo].[TRANSACTIONS_TBL] 
AFTER INSERT, UPDATE, DELETE 
AS 
    DECLARE @SERVICE_CODE INT 
    DECLARE @INVOICE_NO INT 
    DECLARE @PATIENT_TYPE_ID INT 
    DECLARE @INSURANCE_COMPANY_ID INT 
    DECLARE @INSURANCE_CARD_NO VARCHAR(50) 
    DECLARE @SPONSER_TYPE_ID INT 
    DECLARE @QTY_OF_SERVICES INT 
    DECLARE @PATIENT_NAME_ID INT 
    DECLARE @LAB_TEST_CATEGORY_ID INT 
    DECLARE @LAB_TEST_NAME nvarchar(100) 
    DECLARE @LAB_TEST_RESULT VARCHAR(100) 
    DECLARE @RESULT_REFERENCE_VALUE nvarchar(70) 
    DECLARE @TEST_UNIT nvarchar(50) 

    INSERT INTO LAB_TESTS_RESULTS (SERVICE_CODE, INVOICE_NO, PATIENT_TYPE_ID, 
            INSURANCE_COMPANY_ID, INSURANCE_CARD_NO, 
            SPONSER_TYPE_ID, QTY_OF_SERVICES, PATIENT_NAME_ID, 
            LAB_TEST_CATEGORY_ID, LAB_TEST_NAME, 
            LAB_TEST_RESULT, RESULT_REFERENCE_VALUE, TEST_UNIT) 
     SELECT 
      t1.SERVICE_CODE, t1.INVOICE_NO, t1.PATIENT_TYPE_ID, 
      t1.INSURANCE_COMPANY_ID, t1.INSURANCE_CARD_NO, 
      t1.SPONSER_TYPE_ID, t1.QTY_OF_SERVICES, t1.PATIENT_NAME_ID, 
      t2.LAB_TEST_CATEGORY_ID, t2.LAB_TEST_NAME, 
      t2.LAB_TEST_RESULT, t2.RESULT_REFERENCE_VALUE, t2.TEST_UNIT 
     FROM  
      TRANSACTIONS_TBL t1 
     CROSS JOIN 
      LAB_TESTS_NAMES_TBL t2 
     WHERE 
      t1.SERVICE_CODE = t2.SERVICE_CODE 
GO 

如何插入值只有當不存在其他更新嗎?

+1

什麼是你的表的關鍵,是吧' SERVICE_CODE'? –

+0

您需要查看觸發器內的「插入」和「已刪除」僞表 - 這些僞表包含要插入,刪除或更新的行。基於這些行,你可以插入和/或更新其他行......但爲了簡單起見,我真的建議有**三個單獨的**觸發器 - 每種類型的操作('FOR INSERT'插入新行;'FOR UPDATE'只更新現有行,'FOR DELETE'只刪除現有行。 –

回答

0

假設你的表的關鍵是SERVICE_CODE,按照下面的方法: -

IF EXISTS (SELECT * FROM LAB_TESTS_RESULTS WHERE SERVICE_CODE = @SERVICE_CODE) 
    BEGIN 
      -- Put your update statement here 
    End 
Else 
    BEGIN 
      -- Put your Insert statement here 
    End 

的完整代碼: -

CREATE TRIGGER [dbo].[INSERT_TR_LAB_TESTS_RESULTS] 
ON [dbo].[TRANSACTIONS_TBL] 
AFTER INSERT, UPDATE, DELETE 
AS 
    DECLARE @SERVICE_CODE INT 
    DECLARE @INVOICE_NO INT 
    DECLARE @PATIENT_TYPE_ID INT 
    DECLARE @INSURANCE_COMPANY_ID INT 
    DECLARE @INSURANCE_CARD_NO VARCHAR(50) 
    DECLARE @SPONSER_TYPE_ID INT 
    DECLARE @QTY_OF_SERVICES INT 
    DECLARE @PATIENT_NAME_ID INT 
    DECLARE @LAB_TEST_CATEGORY_ID INT 
    DECLARE @LAB_TEST_NAME nvarchar(100) 
    DECLARE @LAB_TEST_RESULT VARCHAR(100) 
    DECLARE @RESULT_REFERENCE_VALUE nvarchar(70) 
    DECLARE @TEST_UNIT nvarchar(50) 

    IF EXISTS (SELECT * FROM LAB_TESTS_RESULTS WHERE SERVICE_CODE = @SERVICE_CODE) 
    BEGIN 
     Update LAB_TESTS_RESULTS 
     Set 
      INVOICE_NO = @INVOICE_NO, 
      PATIENT_TYPE_ID = @PATIENT_TYPE_ID , 
      INSURANCE_COMPANY_ID = @INSURANCE_COMPANY_ID, 
      INSURANCE_CARD_NO = @INSURANCE_CARD_NO, 
      SPONSER_TYPE_ID = @SPONSER_TYPE_ID, 
      QTY_OF_SERVICES = @QTY_OF_SERVICES, 
      PATIENT_NAME_ID = @PATIENT_NAME_ID, 
      LAB_TEST_CATEGORY_ID = @LAB_TEST_CATEGORY_ID, 
      LAB_TEST_NAME = @LAB_TEST_NAME, 
      LAB_TEST_RESULT = @LAB_TEST_RESULT, 
      RESULT_REFERENCE_VALUE = @RESULT_REFERENCE_VALUE, 
      TEST_UNIT = @TEST_UNIT 
     Where 
      SERVICE_CODE = @SERVICE_CODE 
    END 
    ELSE 
    BEGIN 
     INSERT INTO LAB_TESTS_RESULTS (SERVICE_CODE, INVOICE_NO, PATIENT_TYPE_ID, INSURANCE_COMPANY_ID, INSURANCE_CARD_NO, SPONSER_TYPE_ID, QTY_OF_SERVICES, PATIENT_NAME_ID, LAB_TEST_CATEGORY_ID, LAB_TEST_NAME, LAB_TEST_RESULT, RESULT_REFERENCE_VALUE, TEST_UNIT) 
     SELECT 
      t1.SERVICE_CODE, t1.INVOICE_NO, t1.PATIENT_TYPE_ID, 
      t1.INSURANCE_COMPANY_ID, t1.INSURANCE_CARD_NO, 
      t1.SPONSER_TYPE_ID, t1.QTY_OF_SERVICES, t1.PATIENT_NAME_ID, 
      t2.LAB_TEST_CATEGORY_ID, t2.LAB_TEST_NAME, 
      t2.LAB_TEST_RESULT, t2.RESULT_REFERENCE_VALUE, t2.TEST_UNIT 
     FROM  
      TRANSACTIONS_TBL t1 
     CROSS JOIN 
      LAB_TESTS_NAMES_TBL t2 
     WHERE 
      t1.SERVICE_CODE = t2.SERVICE_CODE 
    END 

GO 
+0

謝謝艾哈邁德Abdelqader爲您的答案 但問題是在新插入到TRANSACTIONS_TBL表 後觸發器插入帶有舊記錄的新記錄(重新插入記錄)到LAB_TESTS_RESULTS表 –

相關問題