我如何转换此代码以支持 MS SQL TVP 批量插入和更新
How can I convert this code to support MS SQL TVP bulk insert and update
目前,我正在将值一个一个插入table 'table_name'。我可以预期此查询的插入和更新请求,但在这些操作期间,我必须注意一个条件,即不会向会议中的与会者提供相同的条形码。现在我想使用 TVP 方法将其更改为批量操作。有人可以帮我解决这个问题吗?
注意 - 此 table 的组合键是 (account_id, meeting_id, barcode)
IF NOT EXISTS (SELECT 1
FROM table_name a
WHERE a.account_id = #{account_id}
AND a.meeting_id = #{meeting_id}
AND a.barcode = #{barcode})
BEGIN
IF NOT EXISTS (SELECT 1
FROM table_name a
WHERE a.attendee_id = #{attendee_id})
INSERT INTO table_name
(account_id,
meeting_id,
barcode,
attendee_id)
VALUES ( #{account_id},
#{meeting_id},
#{barcode},
#{attendee_id} )
ELSE
UPDATE table_name
SET barcode = #{barcode}
WHERE attendee_id = #{attendee_id}
END
看起来你可以用 MERGE
来做到这一点。
MERGE table_name t
USING @YourTVP s
ON t.account_id = s.account_id
AND t.meeting_id = s.meeting_id
AND t.attendee_id = s.attendee_id
WHEN MATCHED THEN
UPDATE SET
barcode = s.barcode
WHEN NOT MATCHED THEN
INSERT ( account_id, meeting_id, barcode, attendee_id)
VALUES (s.account_id, s.meeting_id, s.barcode,s.attendee_id)
;
要排除具有现有条形码的行,您可以执行以下操作
WITH source AS (
SELECT *
FROM @YourTVP s
WHERE NOT EXISTS (SELECT 1
FROM table_name t
WHERE t.account_id = s.account_id
AND t.meeting_id = s.meeting_id
AND t.barcode = s.barcode)
)
MERGE table_name t
USING source s
ON t.account_id = s.account_id
AND t.meeting_id = s.meeting_id
AND t.attendee_id = s.attendee_id
WHEN MATCHED THEN
UPDATE SET
barcode = s.barcode
WHEN NOT MATCHED THEN
INSERT ( account_id, meeting_id, barcode, attendee_id)
VALUES (s.account_id, s.meeting_id, s.barcode,s.attendee_id)
;
目前,我正在将值一个一个插入table 'table_name'。我可以预期此查询的插入和更新请求,但在这些操作期间,我必须注意一个条件,即不会向会议中的与会者提供相同的条形码。现在我想使用 TVP 方法将其更改为批量操作。有人可以帮我解决这个问题吗? 注意 - 此 table 的组合键是 (account_id, meeting_id, barcode)
IF NOT EXISTS (SELECT 1
FROM table_name a
WHERE a.account_id = #{account_id}
AND a.meeting_id = #{meeting_id}
AND a.barcode = #{barcode})
BEGIN
IF NOT EXISTS (SELECT 1
FROM table_name a
WHERE a.attendee_id = #{attendee_id})
INSERT INTO table_name
(account_id,
meeting_id,
barcode,
attendee_id)
VALUES ( #{account_id},
#{meeting_id},
#{barcode},
#{attendee_id} )
ELSE
UPDATE table_name
SET barcode = #{barcode}
WHERE attendee_id = #{attendee_id}
END
看起来你可以用 MERGE
来做到这一点。
MERGE table_name t
USING @YourTVP s
ON t.account_id = s.account_id
AND t.meeting_id = s.meeting_id
AND t.attendee_id = s.attendee_id
WHEN MATCHED THEN
UPDATE SET
barcode = s.barcode
WHEN NOT MATCHED THEN
INSERT ( account_id, meeting_id, barcode, attendee_id)
VALUES (s.account_id, s.meeting_id, s.barcode,s.attendee_id)
;
要排除具有现有条形码的行,您可以执行以下操作
WITH source AS (
SELECT *
FROM @YourTVP s
WHERE NOT EXISTS (SELECT 1
FROM table_name t
WHERE t.account_id = s.account_id
AND t.meeting_id = s.meeting_id
AND t.barcode = s.barcode)
)
MERGE table_name t
USING source s
ON t.account_id = s.account_id
AND t.meeting_id = s.meeting_id
AND t.attendee_id = s.attendee_id
WHEN MATCHED THEN
UPDATE SET
barcode = s.barcode
WHEN NOT MATCHED THEN
INSERT ( account_id, meeting_id, barcode, attendee_id)
VALUES (s.account_id, s.meeting_id, s.barcode,s.attendee_id)
;