在 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 )
论坛。
我正在使用 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 )