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
我正在尝试根据条件对 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