sql - 使用 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 次处决中执行的。有人可以帮助我实现这一目标吗?
谢谢
解决方案
您可以使用事务来锁定表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
推荐阅读
- angular - 如何动态修改角度分量输入值
- windows-installer - 带有 GUI 安装程序的 InstallShield 安装程序错误 2006
- mfc - 使用 MFC 在不更改 GUI 的情况下动态读取卫星 DLL
- html - CSS 响应式布局
- r - 将 model$finalModel$formula 应用于新模型?
- unity3d - 统一游戏对象的宽度和高度
- java - 如何在不将整个文件读入 RAM 的情况下逐行读取文件
- javascript - 如何使用 id mongodb 在嵌入式文档数组中查找数据?
- elasticsearch - Elasticsearch 复杂的多桶时间聚合 - 会话数据到用户计数
- javascript - SMTPConnection._formatError 处的 Nodemailer 连接超时