簡體   English   中英

如何編寫存儲過程以選擇,刪除然后插入?

[英]How to write a Stored Procedure to Select, Delete and then Insert?

我正在為我的UI測試加載示例數據,為此,我正在嘗試檢查數據是否存在。 如果是,則將其刪除,然后插入新的。 我幾乎有9個插入,我不確定是否需要檢查每一行是否存在,然后刪除每一行然后插入。

這是我嘗試使用SP加載的示例數據。

INSERT INTO TRANS_MDATA (TRANSACTION_ID, MDATA_ATTRB, MDATA_VALUE, CREATED_TIME, LAST_MOD_TIME, ISACTIVE) VALUES 
(212019, 'SOURCE', 'COMP', getDate(), getDate(), 1); 

INSERT INTO TRANS_MDATA (TRANSACTION_ID, MDATA_ATTRB, MDATA_VALUE, CREATED_TIME, LAST_MOD_TIME, ISACTIVE) VALUES 
(212019, 'SOURCE', 'COMP1', getDate(), getDate(), 1); 

INSERT INTO TRANS_MDATA (TRANSACTION_ID, MDATA_ATTRB, MDATA_VALUE, CREATED_TIME, LAST_MOD_TIME, ISACTIVE) VALUES 
(212019, 'SOURCE', 'COMP2', getDate(), getDate(), 2);  

INSERT INTO TRANS_MDATA (TRANSACTION_ID, MDATA_ATTRB, MDATA_VALUE, CREATED_TIME, LAST_MOD_TIME, ISACTIVE) VALUES 
(212019, 'SOURCE', 'COMP3', getDate(), getDate(), 3); 

INSERT INTO TRANS_MDATA (TRANSACTION_ID, MDATA_ATTRB, MDATA_VALUE, CREATED_TIME, LAST_MOD_TIME, ISACTIVE) VALUES 
(212019, 'SOURCE', 'COMP4', getDate(), getDate(), 4); 

INSERT INTO TRANS_MDATA (TRANSACTION_ID, MDATA_ATTRB, MDATA_VALUE, CREATED_TIME, LAST_MOD_TIME, ISACTIVE) VALUES 
(212019, 'SOURCE', 'COMP5', getDate(), getDate(), 5); ; 

INSERT INTO TRANS_MDATA (TRANSACTION_ID, MDATA_ATTRB, MDATA_VALUE, CREATED_TIME, LAST_MOD_TIME, ISACTIVE) VALUES 
(212019, 'SOURCE', 'COMP6', getDate(), getDate(), 6);  

INSERT INTO TRANS_MDATA (TRANSACTION_ID, MDATA_ATTRB, MDATA_VALUE, CREATED_TIME, LAST_MOD_TIME, ISACTIVE) VALUES 
(212019, 'SOURCE', 'COMP7', getDate(), getDate(), 7);  

INSERT INTO TRANS_MDATA (TRANSACTION_ID, MDATA_ATTRB, MDATA_VALUE, CREATED_TIME, LAST_MOD_TIME, ISACTIVE) VALUES 
(212019, 'SOURCE', 'COMP8', getDate(), getDate(), 8); 

儲存程序

CREATE PROCEDURE TRANSACTION
@TRANSACTION_ID int,
@MDATA_ATTRB varchar,
@MDATA_VALUE varchar,
@ISACTIVE bit

AS
BEGIN
IF EXISTS (SELECT * FROM TRANS_MDATA WHERE TRANSACTION_ID = @TRANSACTION_ID)

BEGIN
DELETE FROM TRANS_MDATA WHERE TRANSACTION_ID = @TRANSACTION_ID
END

ELSE
INSERT INTO TRANS_MDATA (TRANSACTION_ID, MDATA_ATTRB, MDATA_VALUE, CREATED_TIME, LAST_MOD_TIME, ISACTIVE)
VALUES (@TRANSACTION_ID, MDATA_ATTRB, MDATA_VALUE, getdate(), getDate(), @ISACTIVE)
END 
END

EXEC [TRANSACTION]
@TRANSACTION_ID = 123456,
@MDATA_ATTRB = 'Source',
@MDATA_VALUE = 'Backend',
@ISACTIVE bit = 1

您可以在插入物中使用EXCEPT來檢查跨許多列的數據是否匹配:

--  Set up a CTE pseudo-table of your test data:
; WITH TestValues
AS (
    SELECT DISTINCT TRANSACTION_ID, MDATA_ATTRB, MDATA_VALUE, CREATED_TIME, LAST_MOD_TIME, ISACTIVE
    FROM (
    VALUES (212019, 'SOURCE', 'COMP', getDate(), getDate(), 1)
        , (212019, 'SOURCE', 'COMP1', getDate(), getDate(), 1)
        ,(212019, 'SOURCE', 'COMP2', getDate(), getDate(), 2)
        ,(212019, 'SOURCE', 'COMP3', getDate(), getDate(), 3)
        ,(212019, 'SOURCE', 'COMP4', getDate(), getDate(), 4)
        ,(212019, 'SOURCE', 'COMP5', getDate(), getDate(), 5)
        ,(212019, 'SOURCE', 'COMP6', getDate(), getDate(), 6)
        ,(212019, 'SOURCE', 'COMP7', getDate(), getDate(), 7)
        ,(212019, 'SOURCE', 'COMP8', getDate(), GETDATE(), 8) 
    ) t1 (TRANSACTION_ID, MDATA_ATTRB, MDATA_VALUE, CREATED_TIME, LAST_MOD_TIME, ISACTIVE)
    )
    --  Insert anything not already in the target table (EXCEPT):
    INSERT INTO TRANS_MDATA(TRANSACTION_ID, MDATA_ATTRB, MDATA_VALUE, CREATED_TIME, LAST_MOD_TIME, ISACTIVE)
    SELECT TRANSACTION_ID, MDATA_ATTRB, MDATA_VALUE, CREATED_TIME, LAST_MOD_TIME, ISACTIVE
    FROM TestValues
    EXCEPT
    SELECT TRANSACTION_ID, MDATA_ATTRB, MDATA_VALUE, CREATED_TIME, LAST_MOD_TIME, ISACTIVE
    FROM TRANS_MDATA

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM