【问题标题】:How to write a Stored Procedure to Select, Delete and then Insert?如何编写存储过程来选择、删除然后插入?
【发布时间】:2017-09-11 21:02:17
【问题描述】:

我正在为我的 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

【问题讨论】:

  • 只需更新而不是删除/插入。另外,不要命名您的 proc 事务,因为它是保留关键字。
  • @Xedni。我确实需要删除。如果数据集存在,则删除,否则插入新记录。
  • 好的,那有什么问题?
  • 如果数据已经存在,您就不会插入数据。它只是删除该记录。也许您可以删除 IF ...ELSE 语句并运行 DELETE 和 INSERT 语句。 Delete 语句已经有一个 where 子句,它基本上是检查事务 id 是否存在

标签: sql sql-server database stored-procedures


【解决方案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

【讨论】:

    猜你喜欢
    • 2019-08-10
    • 1970-01-01
    • 2011-09-21
    • 1970-01-01
    • 2019-04-09
    • 1970-01-01
    • 1970-01-01
    • 2021-11-20
    • 1970-01-01
    相关资源
    最近更新 更多