Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 首先发生什么:计算的持久化字段或插入触发器更新_Sql Server_Sql Server 2008 - Fatal编程技术网

Sql server 首先发生什么:计算的持久化字段或插入触发器更新

Sql server 首先发生什么:计算的持久化字段或插入触发器更新,sql-server,sql-server-2008,Sql Server,Sql Server 2008,我有一个包含持久化计算字段的表。它有一个触发器,可以根据包括持久化字段在内的多个字段更新某些字段 先更新哪一个,持久化字段还是触发器的更新?这可能需要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

我有一个包含持久化计算字段的表。它有一个触发器,可以根据包括持久化字段在内的多个字段更新某些字段


先更新哪一个,持久化字段还是触发器的更新?

这可能需要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

也就是说,插入的伪表中始终可以使用计算列,这才是您真正应该关心的。

可能需要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

也就是说,插入的伪表中始终可以使用计算列,这是您真正应该关心的。

在实际插入之前计算持久化的计算值。触发器发生在插入之后。因此,持久化计算值在触发器中始终可用


对于非持久化计算值也是如此,但机制不同:对非持久化计算值的任何访问都将动态计算该值,包括来自触发器本身的访问。因此,该值也将在触发器中可用。

在实际插入之前计算保留的计算值。触发器发生在插入之后。因此,持久化计算值在触发器中始终可用


对于非持久化计算值也是如此,但机制不同:对非持久化计算值的任何访问都将动态计算该值,包括来自触发器本身的访问。因此,该值也将在触发器中可用。

您可以模拟触发器脚本的示例吗?Sql Server具有Instead of和After触发器,它可能会对您所指的内容产生影响。你能模拟一个触发器脚本的例子吗?Sql Server具有Instead of和After触发器,它可能会对您所指的内容产生影响。而不是在之前和之后开火。