子查询返回的值超过1…”

qncylg1j  于 2021-07-27  发布在  Java
关注(0)|答案(1)|浏览(360)

我正在尝试根据条件对表执行大规模更新。

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

我甚至尝试了同样的错误:

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
wkftcu5l

wkftcu5l1#

问题在于触发码。SQLServer的触发器操作语句级别,因此在 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

相关问题