2017-09-11 32 views
0

我正在加載我的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 
+0

只是做一個更新,而不是刪除/插入的。另外,不要命名你的proc事務,因爲它是一個保留關鍵字。 – Xedni

+0

這可能與https://stackoverflow.com/questions/11010511/how-to-upsert-update-or-insert-in-sql-server-2005 –

+0

@Xedni相同。我確實需要刪除。如果數據集存在刪除,則插入新記錄。 – Mike

回答

0

可以使用除了在您的插入檢查跨多個列的匹配數據:

-- 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