SQL DELETE语句如何不用逐列指定即可将Deleted.*插入目标表
SQL DELETE 语句 OUTPUT INTO 免列名实现方案
最优实现方式
只要满足以下两个前提,你完全不需要手动指定任何插入列,即可实现全量删除数据导入目标表:
DELETE FROM OriginTable OUTPUT DELETED.* INTO NewTable WHERE ConditionsHere
前提条件:
- 目标表
NewTable的字段数量、顺序、数据类型与原表OriginTable完全匹配 - 目标表不存在需要跳过的特殊字段(如自增标识列、计算列、非空且未设置合理默认值的字段)
结构不匹配时的高效列生成方案
如果目标表和原表结构不一致,必须显式指定插入列,你提到的系统视图拼接就是效率最高的实现方案,SQL Server下可直接运行以下脚本生成全列名列表:
SELECT STRING_AGG(QUOTENAME(name), ', ') FROM sys.columns WHERE object_id = OBJECT_ID('OriginTable') -- 可按需添加过滤条件排除不需要的字段:AND name NOT IN ('ColA', 'ColB')
运行后直接输出逗号分隔的全列名,复制到语句中即可使用,不需要手动逐列录入。
常见误区纠正:你原有语句中
INTO NewTable (Deleted.Col1, Deleted.Col2, Deleted.Col3)的写法不符合规范:INTO后括号内为目标表的列名,不需要加Deleted.前缀,OUTPUT子句已经指定了输出数据源为删除的行数据,只要列顺序对应即可正常插入。
内容的提问来源于stack exchange,提问作者Th3Phantomz
相关产品推荐
相关产品推荐

