Sql 表上的大规模更新。错误';Msg 512-子查询返回的值超过1';

Sql 表上的大规模更新。错误';Msg 512-子查询返回的值超过1';,sql,triggers,sql-update,sql-insert,sql-server-2016,Sql,Triggers,Sql Update,Sql Insert,Sql Server 2016,我正在尝试根据条件对表执行大规模更新 UPDATE POHeader SET POStatus = 'Cancelled' WHERE POStatus = 'Draft' AND Created <= DATEADD(DD, DATEDIFF(DD, '', GETDATE())-29, '') 请提供帮助,因为要更新的数量已达到数千,并且不能逐个更新 更新触发器 问题在于触发代码。SQL Server的触发器操作语句级别,因此插入的中将有多行。如果触发触发器的u

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

UPDATE  POHeader
SET     POStatus = 'Cancelled'
WHERE   POStatus = 'Draft'
    AND Created <= DATEADD(DD, DATEDIFF(DD, '', GETDATE())-29, '')
请提供帮助,因为要更新的数量已达到数千,并且不能逐个更新

更新触发器
问题在于触发代码。SQL Server的触发器操作语句级别,因此插入的
中将有多行。如果触发触发器的
update
语句影响了多行,则会出现错误

您可以使用
insert。。。选择
语法:

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

问题在于触发代码。SQL Server的触发器操作语句级别,因此插入的
中将有多行。如果触发触发器的
update
语句影响了多行,则会出现错误

您可以使用
insert。。。选择
语法:

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

此查询不可能引发该错误。请向我们显示您的实际查询…该SQL中没有子查询,因此无法生成该错误。请使用实际查询编辑查询(我只修改了它的表名)。恐怕这就是我执行查询时遇到的错误。我也很惊讶@Helmi Fikri:是的,最有可能的是
UPDATE
触发器的格式不正确,并引发您正在得到的错误。您需要检查该触发器的代码,并将其修复。@GMB已检查该触发器。我在问题中包括了触发器。在我看来,它的形式是好的,不应该停止大规模更新。请提供帮助。此查询不可能引发该错误。请向我们显示您的实际查询…该SQL中没有子查询,因此无法生成该错误。请使用实际查询编辑查询(我只修改了它的表名)。恐怕这就是我执行查询时遇到的错误。我也很惊讶@Helmi Fikri:是的,最有可能的是
UPDATE
触发器的格式不正确,并引发您正在得到的错误。您需要检查该触发器的代码,并将其修复。@GMB已检查该触发器。我在问题中包括了触发器。在我看来,它的形式是好的,不应该停止大规模更新。请帮忙。非常感谢你的建议。它解决了我的大规模更新问题。非常感谢你的建议。它解决了我的大规模更新问题。
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