首页 > 解决方案 > 如何使用存储过程访问插入和删除的逻辑表

问题描述

有没有一种方法可以使用存储过程或函数访问inserted和表,而不使用或传递来自触发器的值。deleted

前任:

INSERT INTO dbo.Table (ID) 
VALUES (1)

SELECT * FROM inserted   -> This raises an error

有没有办法做这样的事情来捕获插入的值?

我能够对使用如下MERGE命令的查询执行此操作。

MERGE Products AS TARGET
USING UpdatedProducts AS SOURCE ON (TARGET.ProductID = SOURCE.ProductID)  

WHEN MATCHED AND TARGET.ProductName <> SOURCE.ProductName 
                 OR TARGET.Rate <> SOURCE.Rate 
   THEN 
      UPDATE SET TARGET.ProductName = SOURCE.ProductName, 
                 TARGET.Rate = SOURCE.Rate 

WHEN NOT MATCHED BY TARGET 
   THEN 
      INSERT (ProductID, ProductName, Rate) 
      VALUES (SOURCE.ProductID, SOURCE.ProductName, SOURCE.Rate)

WHEN NOT MATCHED BY SOURCE 
   THEN 
      DELETE

OUTPUT 
    $action, 
    DELETED.ProductID AS TargetProductID, 
    DELETED.ProductName AS TargetProductName, 
    DELETED.Rate AS TargetRate, 
    INSERTED.ProductID AS SourceProductID, 
    INSERTED.ProductName AS SourceProductName, 
    INSERTED.Rate AS SourceRate; 

有没有办法为简单的 SQL 查询访问inserted和表?deleted

标签: sql-servertsql

解决方案


只能在触发器或DML语句的子句中使用insertedand表。deletedoutput

insert语句中,output子句可以引用inserted表:

DECLARE @Ids AS TABLE (id int);

INSERT INTO dbo.Table (ID) 
OUTPUT Inserted.ID INTO @Ids(id)
VALUES (1), (2), (3);

update语句中,您可以同时引用inserted表和已删除的表:

DECLARE @Ids AS TABLE (oldId int, newId int);

UPDATE dbo.Table 
SET ID = 1
OUTPUT Deleted.ID, Inserted.ID INTO @Ids(oldId, newId);

delete声明中,您可以引用该deleted表:

DECLARE @Ids AS TABLE (id int);

DELETE dbo.Table 
OUTPUT Inserted.ID INTO @Ids(id)
FROM dbo.Table 
WHERE ID IN (1, 2, 3);

语句是唯一的Merge,因为您可以访问源表和它的输出子句中的inserted/表,如本文所示。deleted


推荐阅读