Sql server 只有在SQL Server表尚不存在时,如何创建触发器语句将值插入SQL Server表?

Sql server 只有在SQL Server表尚不存在时,如何创建触发器语句将值插入SQL Server表?,sql-server,triggers,sql-update,sql-insert,sql-delete,Sql Server,Triggers,Sql Update,Sql Insert,Sql Delete,我正在使用SQL Server 2014。我有以下代码来创建触发器(它插入数据): 如何仅在不存在或更新值时插入值 假设表的键是服务\u代码,请遵循下一种方法:- IF EXISTS (SELECT * FROM LAB_TESTS_RESULTS WHERE SERVICE_CODE = @SERVICE_CODE) BEGIN -- Put your update statement here End Else BEGIN

我正在使用SQL Server 2014。我有以下代码来创建触发器(它插入数据):


如何仅在不存在或更新值时插入值

假设表的键是
服务\u代码
,请遵循下一种方法:-

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

表的键是什么,是
SERVICE\u code
?您需要查看触发器中的
Inserted
Deleted
伪表-这些表包含插入、删除或更新的行。基于这些行,您可以插入和/或更新其他行。。。。但为了简单起见,我真的建议使用三个单独的触发器—每种类型的操作一个(
用于插入
—仅插入新行;
用于更新
仅更新现有行;
用于删除
仅删除现有行).感谢Ahmed Abdelqader的回答,但问题是在新插入到事务表后,触发器将新记录插入旧记录(重新插入记录)到实验室测试结果表
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