如果我有一个 AFTER UPDATE 触发器,将
SELECT * FROM inserted
和
SELECT * FROM deleted
按照同样的顺序把他们的记录还给我?
IE。假设我能够索引到他们的结果集,会
del[5] 和 ins[5] 给我返回匹配的条目,即使复合主键的一个值发生了变化(这将是内部联接不起作用的原因)。
最佳答案
我不相信对插入和删除中的行的排序有任何保证——就像没有从任何表中选择的排序保证一样,没有指定 ORDER BY。
我决定看看我是否可以制作一个脚本来证明缺乏排序。在我的机器(SQL 2008 Dev)上,我可以重复运行以下脚本。它从插入和删除中输出 2 行。请注意,我们没有触及 ID 列,因此如果假设是正确的(它们以某种方式排序),那么相同的 ID 应该以相同的顺序出现。这不是这里的情况。
首先,输出:
ID D1 V1
----------- ----------------------- ----------------------------------------------------------------------------------------------------
32 2010-03-01 00:00:00.000 text
60 2010-02-01 00:00:00.000 text
(2 row(s) affected)
ID D1 V1
----------- ----------------------- ----------------------------------------------------------------------------------------------------
60 2010-03-01 00:00:00.000 text
32 2010-02-01 00:00:00.000 text
(2 row(s) affected)
以及产生这个的脚本:
create table T1 (
ID int not null,
D1 datetime not null,
V1 varchar(100) not null,
constraint PK_T1 PRIMARY KEY (D1,ID)
)
go
create index IX_T1_D1 on T1(D1)
go
insert into T1(ID,D1,V1)
select ID,DATEADD(day,ID-1,'20100101'),'text'
from (select ROW_NUMBER() OVER (ORDER BY so1.id) from sysobjects so1,sysobjects so2,sysobjects) t(ID)
go
create trigger T_T1_U on T1 after update
as
begin
select * from inserted
select * from deleted
end
go
sp_configure 'disallow results from triggers',0
go
RECONFIGURE
go
update T1 set D1 = DATEADD(month,CASE WHEN DATEPART(month,D1)=2 THEN 1 ELSE -1 END,D1)
where D1 in ('20100201','20100301')
go
sp_configure 'disallow results from triggers',1
go
RECONFIGURE
go
drop table T1
go
关于tsql - 'inserted' 和 'deleted' 表是否保证在 AFTER UPDATE 触发器中以相同的顺序返回它们的记录?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4183974/