Sql server 如何从中的当前行而不是触发器获取数据?

Sql server 如何从中的当前行而不是触发器获取数据?,sql-server,tsql,triggers,sql-delete,Sql Server,Tsql,Triggers,Sql Delete,例如,我们有一个名为“Names”的表: id | name -----+------ 1 | Mary 2 | Sue 3 | John 这个触发器: CREATE TRIGGER TRG_insofdel ON Names INSTEAD OF DELETE AS BEGIN -- here I need to get some data from the current row END 然后我打电话 DELETE FROM Names WHE

例如,我们有一个名为“Names”的表:

 id  |  name
-----+------
 1   |  Mary
 2   |  Sue
 3   |  John
这个触发器:

CREATE TRIGGER TRG_insofdel
ON Names 
INSTEAD OF DELETE
AS 
BEGIN
    -- here I need to get some data from the current row
END
然后我打电话

DELETE FROM Names 
WHERE id = 1
如何在触发器中获取Mary的id==1名称

在这种情况下,“已删除”表是怎么回事?

确实解释了这一点,但它的布局不是很清楚

在触发器中,SQL server会自动为您提供两个特殊的内存表:

inserted:为insert和update语句添加到表中的数据 已删除:从表中删除的用于update和delete语句的数据 它们具有与实际表相同的列,但完全是只读的—您不能向它们添加列或索引,也不能更改其中的数据

因此,在您的示例中,要获取被删除人员的姓名,可以在触发器内执行以下操作:

DECLARE @name varchar(100);
SELECT @name = name from deleted;
重要提示

请注意,如果从表中删除了多行,则“删除”将包含多行-触发器不会针对每行单独调用一次。

确实解释了这一点,但它的布局不是很清楚

在触发器中,SQL server会自动为您提供两个特殊的内存表:

inserted:为insert和update语句添加到表中的数据 已删除:从表中删除的用于update和delete语句的数据 它们具有与实际表相同的列,但完全是只读的—您不能向它们添加列或索引,也不能更改其中的数据

因此,在您的示例中,要获取被删除人员的姓名,可以在触发器内执行以下操作:

DECLARE @name varchar(100);
SELECT @name = name from deleted;
重要提示


请注意,如果从表中删除了多行,则“删除”将包含多行-不会对每行单独调用触发器。

删除/更新等触发器中没有当前行;deleted返回一个查询批中的所有行。如果您碰巧删除了一行,它将返回该行。您应该给出您希望触发器执行的操作的详细信息,以便我们可以查看它是否可行。“而不是触发器会导致其源DML操作跳过,并且只执行其中提供的代码。”。实际的插入、删除或更新操作根本不会发生。但是,它们具有关联的插入和删除表,模拟DML操作。“-从删除中选择名称;将返回所有要删除的名称。提示:如果您绝对确定触发器中永远不会有多行,请添加行数检查,并使用RaIsError或Throw明确通知稍后出现的人,他们试图执行不可接受的语句。如果选择Count*from inserted>1,则会出现错误“FooTable_Insert:最多只能处理一行”。、25、42和Log删除/更新等触发器中没有当前行;deleted返回一个查询批中的所有行。如果您碰巧删除了一行,它将返回该行。您应该给出您希望触发器执行的操作的详细信息,以便我们可以查看它是否可行。“而不是触发器会导致其源DML操作跳过,并且只执行其中提供的代码。”。实际的插入、删除或更新操作根本不会发生。但是,它们具有关联的插入和删除表,模拟DML操作。“-从删除中选择名称;将返回所有要删除的名称。提示:如果您绝对确定触发器中永远不会有多行,请添加行数检查,并使用RaIsError或Throw明确通知稍后出现的人,他们试图执行不可接受的语句。如果选择Count*from inserted>1,则会出现错误“FooTable_Insert:最多只能处理一行”。、25、42以及日志