table 上的大量更新。错误 'Msg 512 - Subquery returned more than 1 value. ...'

Mass update on table. Error 'Msg 512 - Subquery returned more than 1 value. ...'

我正在尝试根据条件对 table 执行批量更新。

UPDATE  POHeader
SET     POStatus = 'Cancelled'
WHERE   POStatus = 'Draft'
    AND Created <= DATEADD(DD, DATEDIFF(DD, '', GETDATE())-29, '')

我什至试过这些也 return 同样的错误:

UPDATE  POHeader
SET     POStatus = 'Cancelled'
WHERE   POID in (18364, 26401, 27284, 28575, 30532, 30599, 33650,
                 33780, 33783, 33785, 33895, 35644, 35647, 35678,
                 37400, 37546, 38750, 38758, 40568, 42045, ......)

请帮忙,因为要更新的数量已达到数千,而且一个接一个地进行更新不是一种选择。

更新触发器

ALTER TRIGGER [dbo].[POHeader_UPDATE]
   ON  [dbo].[POHeader]
   AFTER UPDATE
AS 
BEGIN
SET NOCOUNT ON;
INSERT INTO [dbo].[POHeaderLog]
           ([ActionDate]
           ,[Action]
           ,[POID]
           ,[CustomerName]
           ,[CustomerCode]
           , ...)
VALUES
           (GETDATE()
           ,'Update'
           ,(select INSERTED.POID from INSERTED)
           ,(select INSERTED.CustomerName from INSERTED)
           ,(select INSERTED.CustomerCode from INSERTED)
           , ...)

END

问题出在触发器代码上。 SQL 服务器的触发器运行 语句 级别,因此 inserted 中会有多行。如果触发触发器的 update 语句影响了不止一行 - 因此出现错误。

您可以使用 insert ... select 语法重写触发器代码:

ALTER TRIGGER [dbo].[POHeader_UPDATE]
   ON  [dbo].[POHeader]
   AFTER UPDATE
AS 
BEGIN
    SET NOCOUNT ON;
    INSERT INTO [dbo].[POHeaderLog]
               ([ActionDate]
               ,[Action]
               ,[POID]
               ,[CustomerName]
               ,[CustomerCode]
               , ...)
    SELECT
               GETDATE()
               ,'Update'
               ,POID
               ,CustomerName
               CustomerCode,
               , ...
    FROM inserted;
END