在 DB2i 合并语句中更新多个列失败

Update More Than One Column Failing in DB2i Merge Statement

论坛。

我正在使用 IBM System i 7.1 版。

我 运行 在更新合并语句中的多个列时遇到问题。

以下语句在设置一列时有效:

merge into database.table as t 
                 using ( values( 
    cast(99 as smallint) 
    ,cast('dave' as varchar(40))
                 )) 
                 as caz(
    group_id
    , group_name
    ) 
                 on t.group_id = caz.group_id 
                 when matched then update
    set t.group_name = caz.group_name
                 when not matched then 
                 insert (
    group_id
    , group_name
    ) 
                 values (
    caz.group_id
    , caz.group_name
    );

当我添加额外的 set 行时,相同的语句不再有效:

merge into database.table as t 
                 using ( values( 
    cast(99 as smallint) 
    ,cast('dave' as varchar(40))
    ,cast(1 as smallint)     
                 )) 
                 as caz(
    group_id
    , group_name
    , queued_calls_above_tasa
    ) 
                 on t.group_id = caz.group_id 
                 when matched then update
    set t.group_name = caz.group_name,
    set t.queued_calls_above_tasa = caz.queued_calls_above_tasa
                 when not matched then 
                 insert (
    group_id
    , group_name
    , queued_calls_above_tasa
    ) 
                 values (
    caz.group_id
    , caz.group_name
    , caz.queued_calls_above_tasa
    );

我收到以下错误消息:

merge into database.table as t using ( values( cast(99 as smallint) ,cast('dave' as varchar(40)) ,cast(1 as smallint) )) as caz(
group_id , group_name , queued_calls_above_tasa )
on t.group_id = caz.group_id when matched then update set t.group_name = caz.group_name, set t.queued_calls_above_tasa = caz.queued_calls_above_tasa
when not matched then insert ( group_id , group_name , queued_calls_above_tasa )
values ( caz.group_id , caz.group_name , caz.queued_calls_above_tasa )

SQL 州:42601
供应商代码:-104
消息:[SQL0104] 令牌 T 无效。有效标记:=。原因 。 . . . . : 在令牌 T 处检测到语法错误。令牌 T 不是 有效令牌。有效标记的部分列表是 =。此列表假定 该陈述在令牌之前是正确的。错误可能是 在语句的前面,但语句的语法似乎 至此为止有效。恢复 。 . . :做一个或多个 以下并再次尝试请求: -- 验证中的 SQL 语句 令牌 T 的区域。更正该语句。错误可能是 缺少逗号或引号,可能是拼写错误的单词,或者它 可能与从句的顺序有关。 -- 如果错误标记是 ,更正 SQL 语句,因为它没有结束 有一个有效的子句。

处理结束,因为突出显示的语句未完成 成功

感谢任何帮助。

如果我可以提供更多信息,请告诉我。

删除第二个'set'让它成功如下:

merge into database.table as t 
                 using ( values( 
    cast(99 as smallint) 
    ,cast('dave' as varchar(40))
    ,cast(1 as smallint)     
                 )) 
                 as caz(
    group_id
    , group_name
    , queued_calls_above_tasa
    ) 
                 on t.group_id = caz.group_id 
                 when matched then update
    set t.group_name = caz.group_name,
    t.queued_calls_above_tasa = caz.queued_calls_above_tasa
                 when not matched then 
                 insert (
    group_id
    , group_name
    , queued_calls_above_tasa
    ) 
                 values (
    caz.group_id
    , caz.group_name
    , caz.queued_calls_above_tasa
    );

@HappyCoding 是正确的,你只需要一个SET语句。

WHEN MATCHED的另一种选择:

when matched then update
    set (t.group_name, t.queued_calls_above_tasa) 
          = (caz.group_name, caz.queued_calls_above_tasa )