如何将MERGE语句的执行结果保存到自定义实体表而非变量表?
解决方案
1. 创建存储MERGE执行结果的实体表
根据你需要捕获的操作信息,先定义好自定义实体表,确保字段类型与MERGE输出的列匹配:
CREATE TABLE MergeOperationResults ( OperationType NVARCHAR(10) NOT NULL, -- 存储操作类型:INSERT/UPDATE/DELETE TargetProductID INT, -- 操作前目标表的ProductID(UPDATE/DELETE时有效) TargetProductName NVARCHAR(100), -- 操作前目标表的ProductName SourceProductID INT, -- 源表的ProductID(INSERT/UPDATE时有效) SourceProductName NVARCHAR(100), -- 源表的ProductName OperationTime DATETIME DEFAULT GETDATE() -- 自动记录操作时间 );
2. 修改MERGE语句,写入实体表并解决重复列问题
重复列是因为OUTPUT子句同时引用了源表和目标表的同名字段,只需给这些字段加别名区分,再通过INTO关键字直接将结果写入实体表:
MERGE TargetProducts AS T USING SourceProducts AS S ON T.ProductID = S.ProductID -- 匹配时更新目标表 WHEN MATCHED THEN UPDATE SET T.ProductName = S.ProductName -- 源表有、目标表无时插入 WHEN NOT MATCHED BY TARGET THEN INSERT (ProductID, ProductName) VALUES (S.ProductID, S.ProductName) -- 目标表有、源表无时删除 WHEN NOT MATCHED BY SOURCE THEN DELETE -- 输出操作结果到实体表,给同名字段加别名避免重复 OUTPUT $action AS OperationType, deleted.ProductID AS TargetProductID, deleted.ProductName AS TargetProductName, inserted.ProductID AS SourceProductID, inserted.ProductName AS SourceProductName INTO MergeOperationResults (OperationType, TargetProductID, TargetProductName, SourceProductID, SourceProductName);
关键说明
$action:SQL Server内置变量,返回当前执行的操作类型(INSERT/UPDATE/DELETE)deleted:代表操作前的目标表记录,仅UPDATE和DELETE操作会有值inserted:代表操作后的新记录,仅INSERT和UPDATE操作会有值- 实体表的列顺序、数据类型必须与
OUTPUT子句返回的列完全匹配,否则会抛出类型不匹配错误
内容的提问来源于stack exchange,提问作者FaCoffee
相关产品推荐
相关产品推荐

