[英]How to write a Stored Procedure to Select, Delete and then Insert?
I am loading a sample data for my UI testing and for that I am trying to check if the data exists. 我正在为我的UI测试加载示例数据,为此,我正在尝试检查数据是否存在。 If it is then delete it and insert the new one instead. 如果是,则将其删除,然后插入新的。 I got almost 9 inserts and I am not sure if I need to check for each row if it exists then delete each row then insert. 我几乎有9个插入,我不确定是否需要检查每一行是否存在,然后删除每一行然后插入。
This is the sample data that I am trying to load using SP. 这是我尝试使用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);
Stored Procedure 储存程序
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
You can use EXCEPT in your insert to check for data matching across many columns: 您可以在插入物中使用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.