Sql server 仅更新插入行的触发器

Sql server 仅更新插入行的触发器,sql-server,sql-server-2008,tsql,Sql Server,Sql Server 2008,Tsql,我正在尝试使用TSQL或SQLServer2008创建一个简单的触发器。问题是:我当前的触发器正在更新整个表。这在一段时间内还可以,但现在该表有超过20k行。所以我想要一个触发器,它只更新正在插入的行 以下是我当前的简单触发器: CREATE TRIGGER trig_MyPplUpdate ON [Persons] FOR INSERT AS Begin Update Persons set MyFile = NULL where Len(MyFile) < 60 En

我正在尝试使用TSQL或SQLServer2008创建一个简单的触发器。问题是:我当前的触发器正在更新整个表。这在一段时间内还可以,但现在该表有超过20k行。所以我想要一个触发器,它只更新正在插入的行

以下是我当前的简单触发器:

CREATE TRIGGER trig_MyPplUpdate
ON [Persons]
FOR INSERT
AS
Begin
 Update Persons
    set MyFile = NULL
    where Len(MyFile) < 60
End
我想我必须使用插入的表或按主键排序的行数函数。有什么想法吗?

您需要在UPDATE语句中加入插入的伪表。请始终注意,SQL Server会对每个语句触发一次触发器,并且该语句可以很好地一次修改/插入多行—因此插入的表很可能包含多行—只需在编写触发器时记住这一点

试着这样做:

CREATE TRIGGER trig_MyPplUpdate
ON [Persons]
FOR INSERT
AS
    UPDATE dbo.Persons
    SET MyFile = NULL
    WHERE Len(MyFile) < 60
    AND PersonID IN (SELECT DISTINCT PersonID FROM Inserted)

或者使用主键所需的任何唯一列来精确获取插入的行。

如果有必要在此处使用触发器,我将使用替代触发器来调整插入前的值,并避免重新连接到基表并在插入后进行更新

CREATE TRIGGER trig_MyPplUpdate
ON [Persons]
INSTEAD OF INSERT
AS
  BEGIN
      INSERT INTO Persons
      SELECT foo,
             bar,
             CASE
               WHEN Len(MyFile) >= 60 THEN MyFile
             END
      FROM   Inserted
  END  

非常感谢你的帮助,我试试看!好吧,让我直说:一个代替触发器意味着在任何插入发生之前,我的触发器将触发?我真的不明白你是怎么写的?那我的文件呢?我必须在互联网上对此进行更多的研究,但我认为这就是我想要的。如果你想让我的生活更轻松,你可以多解释一点,但你写的是我需要的起点。非常感谢@加斯帕79-是的。SQL Server将接受insert语句并构造插入的伪表,该表包含[Persons]中的所有可插入列。然后从中选择以实际插入到基表中。你没有提供你的表结构,所以我不得不补上其他列名。好的,太好了!我现在正在试。我假设When LenMyFile>=THEN Myfile是因为如果不满足该条件,它将不会插入列值,因此它将为null。在另一种情况下,当满足时,它将插入列MyFile。非常感谢,man,认真地=-。@Gaspa79-是的,如果不满足条件,则默认为ELSE NULL。我建议在INSERT语句中显式指定列名-这样,如果您的表突然获得一个额外的列,您将不会得到任何令人不快的惊喜。。。