【问题标题】:Update More Than One Column Failing in DB2i Merge Statement在 DB2i 合并语句中更新多个列失败
【发布时间】:2016-01-12 17:27:11
【问题描述】:

论坛。

我正在使用 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
    );

当我添加额外的设置行时,相同的语句不再起作用:

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)) ,cast(1 as smallint) )) as caz(
group_id , group_name , queued_calls_above_tasa )
t.group_id = caz.group_id 匹配时 更新集 t.group_name = caz.group_name, 设置 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 不是 有效的令牌。有效令牌的部分列表是 =。此列表假设 该声明在令牌上是正确的。错误可能是 在语句的前面,但语句的语法似乎 至此有效。恢复 。 . . :执行一项或多项 以下并再次尝试请求:--验证中的 SQL 语句 令牌 T 的区域。更正陈述。错误可能是 缺少逗号或引号,可能是拼写错误的单词,或者 可能与从句的顺序有关。 -- 如果错误标记是 , 更正 SQL 语句,因为它没有结束 带有一个有效的子句。

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

感谢任何帮助。

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

【问题讨论】:

  • 不再工作是什么意思?您是否收到错误消息,或者您没有得到预期的结果?
  • 谢谢你;我编辑了问题以包含我收到的错误消息详细信息。

标签: sql db2 db2-400


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 感谢您的意见。关于我们的答案和软件最佳实践,您知道一种格式是否比另一种更受欢迎吗?
    • 另一种格式较新,称为 Row Value Constructor (RVC)Row Value Expression 如果您尝试编写代码,支持可能会受到影响使用多个数据库
    • 感谢@Charles 提供的信息。我还发现以下文章作为一个很好的参考:sqlmag.com/sql-server/row-value-constructor
    • @HappyCoding...请注意,该站点适用于 MS SQL Server,而不是 DB2。尽管在这个特定的实例中,这篇文章更适用于 DB2,因为 MS SQL Server 不支持 RVC。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-23
    • 2019-10-16
    • 2018-04-06
    • 2012-02-02
    • 2014-05-04
    • 2020-01-28
    相关资源
    最近更新 更多