2016-01-12 46 views
0

論壇。在DB2i合併聲明中更新多個列失敗

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

我收到以下錯誤信息:

作爲t合併到database.table中使用(values(ca ST(99作爲SMALLINT),澆鑄( '戴夫' 爲varchar(40)),澆鑄(1作爲 SMALLINT)))作爲CAZ(
GROUP_ID,組名,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不是 有效令牌。有效令牌的部分列表是=。此列表假定 該聲明在令牌之前是正確的。聲明中前面的錯誤可能爲 ,但聲明的語法似乎爲 直到此時纔有效。恢復。 。 。 :執行一個或多個 並再次嘗試請求: - 驗證令牌T的區域 中的SQL語句。更正語句。錯誤可能是 缺少逗號或引號,可能是拼錯的單詞,或者它可能與子句的順序有關。 - 如果錯誤標記爲 ,請更正SQL語句,因爲它不會使用有效的子句結束 。

處理結束,因爲高亮顯示的聲明沒有完成 成功

任何幫助表示讚賞。

請讓我知道,如果我可以提供更多的信息。

+0

你說的不再起作用呢?你有錯誤,或者你沒有得到預期的結果? – Olga

+0

謝謝你;我編輯了問題以包含我收到的錯誤消息詳情。 – HappyCoding

回答

0

去除第二「設置」允許它成功如下:

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

感謝您的意見。關於我們的答案和軟件最佳實踐,你知道一種格式比另一種格式更受歡迎嗎? – HappyCoding

+0

另一種格式較新,稱爲**行值構造函數(RVC)**或[行值表達式](https://stackoverflow.com/tags/row-value-expression/info)支持可能有點兒如果您要編寫使用多個數據庫的代碼,請點擊或錯過 – Charles

+0

感謝您的信息,@Charles。我還發現以下文章作爲一個很好的參考:http://sqlmag.com/sql-server/row-value-constructor – HappyCoding