Sql server 触发器在SQL SERVER中更新多行时出错

Sql server 触发器在SQL SERVER中更新多行时出错,sql-server,triggers,Sql Server,Triggers,当我创建一个触发器在一行上正常工作时,我遇到了一个问题,但是当我在多行上应用它时,它会给我这个错误 当子查询在=、!=、=或者当子查询用作表达式时 触发因素是: Create TRIGGER AccountChange ON Customer AFTER UPDATE AS BEGIN IF(UPDATE(TotalSales)) BEGIN DECLARE @TotalSales MONEY, @AccountNumber NVARCHAR(20),

当我创建一个触发器在一行上正常工作时,我遇到了一个问题,但是当我在多行上应用它时,它会给我这个错误

当子查询在=、!=、=或者当子查询用作表达式时

触发因素是:

Create TRIGGER AccountChange
ON Customer
AFTER UPDATE
AS
BEGIN
    IF(UPDATE(TotalSales))
    BEGIN
        DECLARE @TotalSales MONEY, @AccountNumber NVARCHAR(20),
                @TotalSalesOld MONEY, @customText1 NVARCHAR(50),
                @AccountTypeId int

        SET @TotalSales = (SELECT TotalSales FROM INSERTED)
        SET @TotalSalesOld = (SELECT TotalSales FROM DELETED)
        SET @AccountNumber = (SELECT AccountNumber FROM INSERTED)
        SET @AccountTypeId = (SELECT AccountTypeId FROM INSERTED)

        IF(@TotalSales BETWEEN 0 AND 5000)
           UPDATE Customer 
           SET AccountTypeID = 8 
           WHERE AccountNumber = @AccountNumber
   END
END
考虑到我有一个每次都有多个插入/更新的定时连接,我只希望它能够处理任意数量的插入行


提前感谢。

要处理多个受影响行的更新,触发器应如下所示:

CREATE TRIGGER AccountChange
ON dbo.Customer
AFTER UPDATE
AS
BEGIN
    UPDATE dbo.Customer 
    SET AccountTypeID = 8 
    FROM Inserted i
    INNER JOIN Deleted d ON i.AccountId = d.AccountId  -- use the primary key here
    WHERE AccountNumber = i.AccountNumber
      AND i.TotalSales BETWEEN 0 AND 5000
      AND i.TotalSales <> d.TotalSales  -- TotalSales was updated
      AND dbo.Customer.AccountId = i.AccountId   -- use the PK here
END

一个简单明了的基于集合的语句——就这些

您的触发器的主要缺陷是,您似乎认为它将每行调用一次—事实并非如此。每个语句触发一次触发器,因此如果INSERT语句影响25行,则触发一次触发器,但INSERT语句将包含25行。您的代码将在此处选择这25行中的哪一行??从插入中选择TotalSales-这是不确定的。你需要重写你的触发器来考虑这一点!谢谢,它工作得很好: