Sql server 批量更新时触发器工作不正常

Sql server 批量更新时触发器工作不正常,sql-server,sql-server-2008,triggers,sql-server-2000,Sql Server,Sql Server 2008,Triggers,Sql Server 2000,我有一个触发器,在插入到另一个表之前检查数据 IF NOT EXISTS (SELECT * FROM inserted, Clients WHERE Inserted.Account = Clients.Account) BEGIN INSERT INTO Clients(GUID, Account, ....) SELECT GUID, A

我有一个触发器,在插入到另一个表之前检查数据

  IF NOT EXISTS (SELECT *
                 FROM   inserted,
                        Clients
                 WHERE  Inserted.Account = Clients.Account)
  BEGIN
      INSERT INTO Clients(GUID, Account, ....)
      SELECT GUID, Account
      FROM   inserted
  END 
如果更新了一行,工作正常 但如果使用批量更新,则其不起作用

例如,
updatetable1 set Number=帐户“”所在的编号

如果第二个表(客户端)不为空,则不添加任何内容

如果它是空的,它工作得很好

而不是先检查然后插入,为什么不把它写成一个
insert
语句:

Insert into Clients (GUID , Account .....)
Select i.GUID , i.Account 
from
   inserted i
      left join
   Clients c
      on
          i.Account = c.Account
where
    c.Account is null
WHERE
子句中的
NULL
检查可以用于
Clients
中不可为NULL的任何列



即使保持
EXISTS
签入,您仍然需要类似于上面的内容,因为
EXISTS
检查是对插入的
中的所有行进行断言,而它可能包含一些断言为真的行,还有一些行的值为false。

与其先检查然后插入,不如将其作为单个
insert
语句写入:

Insert into Clients (GUID , Account .....)
Select i.GUID , i.Account 
from
   inserted i
      left join
   Clients c
      on
          i.Account = c.Account
where
    c.Account is null
WHERE
子句中的
NULL
检查可以用于
Clients
中不可为NULL的任何列


即使保持
EXISTS
签入,您仍然需要类似于上面的内容,因为
EXISTS
检查是对插入的
中的所有行进行断言-当它可能由断言为真的某些行和断言为假的某些行组成时