我有一个包含持久计算字段的表。它有一个触发器,可以根据包括持久字段在内的多个字段更新某些字段。
首先更新哪个,持久字段或触发器更新?
答案 0 :(得分:3)
这可能需要5分钟才能完成。它回答了你的问题吗?
create table T (
ID int not null,
Val1 varchar(10) not null,
Val2 as SUBSTRING(Val1,1,5) persisted
)
go
create table T2 (
Action char(1) not null,
Val1 varchar(10) not null,
Val2 varchar(5) not null
)
go
create trigger T_T_I
on T
instead of insert
as
insert into T (ID,Val1) select ID,Val1 from inserted
insert into T2 (Action,Val1,Val2) select 'I',Val1,Val2 from inserted
go
create trigger T_T_A
on T
after insert
as
insert into T2 (Action,Val1,Val2) select 'A',Val1,Val2 from inserted
go
insert into T(ID,Val1) values (1,'abcdefghi')
go
select * from T2
结果:
Action Val1 Val2
------ ---------- -----
A abcdefghi abcde
I abcdefghi abcde
也就是说,计算列始终可以从inserted
伪表中获得,这是你真正应该关心的。
答案 1 :(得分:1)
在实际插入之前计算持久计算值。插入后触发器发生。因此,持续计算的值将始终在触发器中可用。
对于非持久计算值也是如此,但其机制不同:对非持久计算值的任何访问都将动态计算该值,包括来自触发器本身的访问。因此,该值也将在触发器中可用。