代码之家  ›  专栏  ›  技术社区  ›  Elizabeth

SQL Server:更新多列导致错误

  •  1
  • Elizabeth  · 技术社区  · 7 年前

    我有个问题

    update a
    set customer_no = 85002123
    from TABLE_DATA a
    where customer_no = 80282318
    

    table\u数据的输出如下所示

    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 钥匙,那不是客户编号。

    它有5行customer\u no 80282318,我希望所有5行都更新为新值,与任何其他条件无关。

    (我无法根据ID键进行更改)因为这只是我们数据的一个子集-我们有数百行这样的数据,每个客户2-5行一组\u否。我无法确定如何运行更新脚本,因为我不断遇到以下错误。

    Msg 512,16级,状态1,过程LT\U TABLE\U DATA\U trigger\U UPDATE,第11行
    子查询返回了多个值。当子查询后跟=,!=,时,不允许这样做<<=>>=或者当子查询用作表达式时。

    代码上的触发器显示以下内容:

    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 回复  |  直到 7 年前
        1
  •  2
  •   Sean Lange    7 年前

    错误消息非常清楚。子查询返回了多行。这是触发器常见但极其严重的缺陷。他们每次操作都会开火一次,而不是每排一次。因此,如果更新的行数超过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
    
        2
  •  0
  •   Von Abanes    7 年前
        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