我如何转换此代码以支持 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)
;