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

时间:2016-01-12 17:27:11

标签: sql db2 db2-400

论坛。

我正在使用IBM System i V7.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
    );

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

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
    );

我收到以下错误消息:

  
    

使用(values(cast(99 as smallint),cast(' dave' as varchar(40))合并为database.table,cast(1 as     smallint)))作为caz(
    group_id,group_name,queued_calls_above_tasa)
    当匹配时,在t.group_id = caz.group_id上     update set t.group_name = caz.group_name,set     t.queued_calls_above_tasa = caz.queued_calls_above_tasa
    如果不匹配则插入(group_id,     group_name,queued_calls_above_tasa)
    值(caz.group_id,caz.group_name,     caz.queued_calls_above_tasa)

  
     

SQL状态:42601
  供应商代码:-104
  消息:[SQL0104]令牌T无效。有效代币:=。原因。 。 。   。 。 :在令牌T处检测到语法错误。令牌T不是a   有效令牌。有效令牌的部分列表是=。此列表假定   声明是正确的,直到令牌。错误可能是   在语句的早期,但语句的语法出现了   到目前为止是有效的。恢复。 。 。 :做一个或多个   跟随并再次尝试请求: - 验证SQL语句   令牌T的区域。更正语句。错误可能是一个   缺少逗号或引号,它可能是拼写错误的单词,或者它   可能与条款的顺序有关。 - 如果错误令牌是   ,更正SQL语句,因为它没有结束   有效条款。

     

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

感谢任何帮助。

如果我可以提供更多信息,请与我们联系。

2 个答案:

答案 0 :(得分:0)

删除第二个'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
    );

答案 1 :(得分:0)

@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 )