好的,我相信这个问题尚不清楚。在这里,我用其他方式重写了这个。假设我创建了两个表,table1(c1 int PRIMARY KEY)table2(table1c11 int)table1和table2之间存在关系即table1.c1=table2.table1c11而且,我在table1和table2中执行以下语句insert into table1(c1)values('a'),('b'),('c'),('d'),('e')insert into table2(table1c11)values('a'),('a'),('b'),('d')现在我要实现的是,一旦更新了c1中的table1值,table2中的相应数据就会自动更改。为此,我需要在table1和table2关系中创建约束并应用CASCADE UPDATE。因此,稍后我在table1中应用新的SQL更新语句,即Update table1 set c1=c1+'updated'然后,table2中的数据也将发生变化,但是如果我想通过INSTEAD OF UPDATE TRIGGER实现相同的功能,那我需要编写而不是更新触发器,并在其中编写两个魔术表和INSERTED。但主要要点是,在这种情况下,DELETED中仅存在一列,并且我正在更新同一列,因此如何映射插入和删除的行。如果我使用CASCADing,SQL Server也将完成同样的事情。因此,出现了一个问题,即如果表中的主键数据发生更改,SQL Server如何处理批处理更新。 (adsbygoogle = window.adsbygoogle || []).push({}); 最佳答案 因此,问题出在以下情况下,SQL Server如何处理批处理更新: 表中的主键数据将发生变化。SQL Server为更新两个表的update语句构建查询计划。创建表:create table T1( T1ID int primary key);create table T2( T2ID int primary key, T1ID int references T1(T1ID) on update cascade)添加一些数据:insert into T1 values(1), (2)insert into T2 values(1, 1), (2, 1), (3, 2)更新T1的主键:update T1set T1.T1ID = 3where T1.T1ID = 1更新的查询计划如下所示:该计划有两个聚集索引更新步骤,一个用于T1,一个用于T2。更新1:当多个主键值被更新时,SQL Server如何跟踪要更新的行?update T1set T1.T1ID = T1.T1ID + 100顶部分支(T1的更新)中的Eager Spool将旧的T1ID和新计算出的T1ID (Expr1013)保存到一个临时表,该表由较低的分支(T2的更新)使用。下部分支中的哈希匹配将表假脱机与旧T2上的T1ID相连。哈希匹配到T2更新的输出是T2ID的聚集索引扫描的T2和表假脱机中新计算的T1ID (Expr1013)。更新2:如果需要用cascade update替换instead of trigger,则需要一种在触发器中联接inserted和deleted表的方法。这可以通过T1中的代理键来完成。表格:create table T1( T1ID int primary key, ID int identity unique);create table T2( T2ID int primary key, T1ID int references T1(T1ID));触发器可能看起来像这样。create trigger tr_T1 on T1 instead of update asinsert into T1(T1ID)select T1IDfrom inserted;update T2set T1ID = I.T1IDfrom inserted as I inner join deleted as D on I.ID = D.IDwhere D.T1ID = T2.T1ID;delete from T1where T1ID in ( select T1ID from deleted );SQL Fiddle (adsbygoogle = window.adsbygoogle || []).push({});
08-19 10:41