SQL Server:更新多列导致错误

时间:2018-02-14 19:43:09

标签: sql-server triggers subquery

我有一个查询

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

2 个答案:

答案 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