我有一个查询
update a
set customer_no = 85002123
from TABLE_DATA a
where customer_no = 80282318
table_data的输出如下所示
Customer_no Season TextField ID
--------------------------------------
80282318 2017 TEXT1 48807
80282318 2017 TEXT2 47043
80282318 2017 TEXT3 47631
80282318 2017 TEXT4 48219
80282318 2017 TEXT5 49395
我们想要的是
Customer_no Season TextField ID
--------------------------------------
85002123 2017 TEXT1 48807
85002123 2017 TEXT2 47043
85002123 2017 TEXT3 47631
85002123 2017 TEXT4 48219
85002123 2017 TEXT5 49395
Table_data
有一个唯一的ID
密钥,不是客户编号。
对于customer_no 80282318,它有5行,我希望所有5行都更新为新值,与其他任何条件无关。
(我无法根据ID键更改它),因为这只是我们数据的一个子集 - 我们有数百个这样的行,每个customer_no为2-5组。我无法弄清楚如何运行更新脚本,因为我不断收到以下错误。
Msg 512,Level 16,State 1,Procedure LT_TABLE_DATA_trigger_UPDATE,Line 11
子查询返回的值超过1。当子查询遵循=,!=,<,< =,>,> =或子查询用作表达式时,不允许这样做。
代码触发器说明如下:
declare @id_key int = (select e.id_key from TABLE_DATA e join inserted i on e.id_key = i.id_key)
update TABLE_DATA
set last_update_dt = GETDATE(),
last_updated_by = user_name()
where id_key = @id_key
答案 0 :(得分:2)
错误消息无法更清楚。您的子查询返回超过1行。这是一个常见但极其严重的触发器缺陷。它们每次操作一次,而不是每次一次。因此,如果您要更新超过1行,这将失败。
尝试删除该标量变量并使用基于集合的方法。
update e
set last_update_dt = GETDATE(),
last_updated_by = user_name()
from TABLE_DATA e
join inserted i on e.id_key = i.id_key
答案 1 :(得分:0)
ALTER TRIGGER <TriggerName> ON dbo.TABLE_DATA
AFTER UPDATE
AS
BEGIN
UPDATE TABLE_DATA
SET last_update_dt = GETDATE() ,
last_updated_by = USER_NAME()
WHERE id_key IN ( SELECT e.id_key
FROM TABLE_DATA e
JOIN inserted i ON e.id_key = i.id_key )
END
GO