首页 > 解决方案 > 使用 SQL 一次删除两个物理表并将它们插入以分隔两个临时表

问题描述

我有一个 SQL 查询,它从物理表(标题、行)中删除记录,并将这些记录插入到 2 个单独的临时表中OUTPUT DELETED.*

DELETE FROM [dbo].[PartnerFilteredLines] 
OUTPUT DELETED.*
INTO @PartnerFilteredLines 
WHERE SettingsFileId=@SettingsSplitId

DELETE FROM [dbo].[PartnerFilteredHeader] 
OUTPUT DELETED.*
INTO @PartnerFilteredHeader 
WHERE SettingsFileId=@SettingsSplitId

两个查询都独立工作。我的要求是以某种方式合并这两个查询并一次执行删除部分(一次执行),因为对于开发要求,此查询计划为 1 秒。因此,有时@PartnerFilteredLines记录存在而@PartnerFilteredHeader不是因为它们是在 2 次处决中执行的。有人可以帮助我实现这一目标吗?

谢谢

标签: sqlsql-serverssmssql-delete

解决方案


您可以使用事务来锁定表PartnerFilteredHeader

CREATE PROCEDURE ...
AS
BEGIN
  BEGIN TRANSACTION

  -- lock table "PartnerFilteredHeader" till end of transaction
  SELECT ...
  FROM PartnerFilteredHeader
  WITH (TABLOCK, HOLDLOCK)

  DELETE FROM [dbo].[PartnerFilteredLines] 
  OUTPUT DELETED.*
  INTO @PartnerFilteredLines 
  WHERE SettingsFileId=@SettingsSplitId
    
  DELETE FROM [dbo].[PartnerFilteredHeader] 
  OUTPUT DELETED.*
  INTO @PartnerFilteredHeader 
  WHERE SettingsFileId=@SettingsSplitId


  -- release lock
  COMMIT TRANSACTION
END

推荐阅读