论坛。
我正在使用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语句,因为它没有结束 有效条款。处理已结束,因为突出显示的语句未完成 成功
感谢任何帮助。
如果我可以提供更多信息,请与我们联系。
答案 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 )