如何在 SAP ASE Sybase 16 中更新一条记录?
How to UPSERT a record in SAP ASE Sybase 16?
我确实在遵循 SAP 文档中关于 UPSERT 中 ASE 记录的第一个示例:
https://help.sap.com/viewer/cbed2190ee2d4486b0bbe0e75bf4b636/16.0.3.2/en-US/faf583d9adc547ad8a164bb3f41ea6cd.html
1> select @@version
2> go
Adaptive Server Enterprise/16.0 SP03 PL06/EBF 28334 SMP/P/x86_64/SLES 11.1/ase1
60sp03pl06x/3457/64-bit/FBO/Mon Nov 26 04:33:30 2018
(1 row affected)
1> select * from t1
2> go
a b c
----------- ----------- -----------
1 2 3
(1 row affected)
1> upsert t1(a,b,c) values(1,2,3)
2> go
Msg 102, Level 15, State 181:
Server 'NPL', Line 1:
Incorrect syntax near 'a'.
有谁知道为什么我会在 UPSERT 语句中收到此“语法不正确”错误?
谢谢
如果唯一的目的是在 ASE
中实现 upsert
功能,那么您要查看的是 merge command.
如果打算利用 HANA SQLScript
(在本例中为 upsert
命令)的(子集)满足某种互操作性要求,请记住您可能需要修改与双重(和不兼容)解析器一起工作的现有代码,然后...
要在 ASE 中使用(有限版本的)HANA SQLScript
,您首先需要创建一个支持 SQLScript
解析器的数据库(参见 Creating a SQLScript database),例如:
use master
go
create database sqlscript_db
on data_01=10
log on log_01=5
for sqlscript -- enable use of SQLScript parser
go
运行 sp_helpdb
(来自 non-SQLScript 数据库)验证数据库状态:
use master
go
sp_helpdb sqlscript_db
go
name db_size owner dbid created durability lobcomplvl inrowlen status
------------ ------------- ----- ---- ------------ ---------- ---------- -------- ---------
sqlscript_db 15.0 MB sa 7 Mar 25, 2022 full 0 NULL sqlscript
... snip ... ^^^^^^^^^
您现在应该可以在这个新数据库中使用 upsert
语句:
use sqlscript_db
go
create table t1 (a int, b int, c int)
go
upsert t1(a,b,c) values(1,2,3)
go
(1 row affected)
select * from t1
go
a b c
----------- ----------- -----------
1 2 3
注意: 在 ASE 16.0 SP04 GA
上验证
验证 SQLScript/upsert
在 non-SQLScript 数据库中不起作用:
use tempdb
go
create table t1 (a int, b int, c int)
go
upsert t1(a,b,c) values(1,1,1)
go
Msg 102, Level 15, State 181:
Server 'ASE400', Line 1:
Incorrect syntax near 'a'.
如果您的唯一键是 t1.a,那么您可以使用以下逻辑:
merge into t1 as dest
using (select 1 a, 2 b, 3 c) as src
on dest.a = src.a
when not matched then
insert (a,b,c) values(src.a,src.b,src.c)
when matched then
update set b=src.b, c=src.c
我确实在遵循 SAP 文档中关于 UPSERT 中 ASE 记录的第一个示例: https://help.sap.com/viewer/cbed2190ee2d4486b0bbe0e75bf4b636/16.0.3.2/en-US/faf583d9adc547ad8a164bb3f41ea6cd.html
1> select @@version
2> go
Adaptive Server Enterprise/16.0 SP03 PL06/EBF 28334 SMP/P/x86_64/SLES 11.1/ase1
60sp03pl06x/3457/64-bit/FBO/Mon Nov 26 04:33:30 2018
(1 row affected)
1> select * from t1
2> go
a b c
----------- ----------- -----------
1 2 3
(1 row affected)
1> upsert t1(a,b,c) values(1,2,3)
2> go
Msg 102, Level 15, State 181:
Server 'NPL', Line 1:
Incorrect syntax near 'a'.
有谁知道为什么我会在 UPSERT 语句中收到此“语法不正确”错误? 谢谢
如果唯一的目的是在 ASE
中实现 upsert
功能,那么您要查看的是 merge command.
如果打算利用 HANA SQLScript
(在本例中为 upsert
命令)的(子集)满足某种互操作性要求,请记住您可能需要修改与双重(和不兼容)解析器一起工作的现有代码,然后...
要在 ASE 中使用(有限版本的)HANA SQLScript
,您首先需要创建一个支持 SQLScript
解析器的数据库(参见 Creating a SQLScript database),例如:
use master
go
create database sqlscript_db
on data_01=10
log on log_01=5
for sqlscript -- enable use of SQLScript parser
go
运行 sp_helpdb
(来自 non-SQLScript 数据库)验证数据库状态:
use master
go
sp_helpdb sqlscript_db
go
name db_size owner dbid created durability lobcomplvl inrowlen status
------------ ------------- ----- ---- ------------ ---------- ---------- -------- ---------
sqlscript_db 15.0 MB sa 7 Mar 25, 2022 full 0 NULL sqlscript
... snip ... ^^^^^^^^^
您现在应该可以在这个新数据库中使用 upsert
语句:
use sqlscript_db
go
create table t1 (a int, b int, c int)
go
upsert t1(a,b,c) values(1,2,3)
go
(1 row affected)
select * from t1
go
a b c
----------- ----------- -----------
1 2 3
注意: 在 ASE 16.0 SP04 GA
验证 SQLScript/upsert
在 non-SQLScript 数据库中不起作用:
use tempdb
go
create table t1 (a int, b int, c int)
go
upsert t1(a,b,c) values(1,1,1)
go
Msg 102, Level 15, State 181:
Server 'ASE400', Line 1:
Incorrect syntax near 'a'.
如果您的唯一键是 t1.a,那么您可以使用以下逻辑:
merge into t1 as dest
using (select 1 a, 2 b, 3 c) as src
on dest.a = src.a
when not matched then
insert (a,b,c) values(src.a,src.b,src.c)
when matched then
update set b=src.b, c=src.c