sql-server - 如何使用存储过程访问插入和删除的逻辑表
问题描述
有没有一种方法可以使用存储过程或函数访问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
解决方案
只能在触发器或DML语句的子句中使用inserted
and表。deleted
output
在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
推荐阅读
- python - 在打开的文件上使用 pd.read_csv
- sql - Oracle 查询输出不正确
- r - 如何用R提取点和括号之间的句子?
- ruby-on-rails - 传递阿拉伯语单词时的轨道切割字符串
- tensorflow - 在 Keras 中创建 CNN 模型架构图
- java - 如何检查网络服务器是否已启动?
- python - python 正则表达式模式
- linux - 如何解决函数调用中的 gcc [-Werror=format-security]?
- google-cloud-dataflow - 将 Pub/Sub 连接到 Dataflow Python 管道
- angular - ion-select 在自定义组件的 ng-content 内部时未更新