暂无图片
暂无图片
5
暂无图片
暂无图片
暂无图片

国产化替代不是选择题!金仓 KES SQL Server 兼容版的“高分答卷”详解

381

大家好,我是 JiekeXu,江湖人称“强哥”,青学会 MOP 技术社区主席,荣获 Oracle ACE Pro 称号,墨天轮 MVP,墨天轮年度“墨力之星”,拥有 Oracle OCP/OCM 认证,MySQL 5.7/8.0 OCP 认证以及 PCA、PCTA、OBCA、OGCA、KCA、KCP、KCSM 等众多国产数据库认证证书,欢迎关注我的微信公众号“JiekeXu DBA之路”,然后点击右上方三个点“设为星标”置顶,更多干货文章才能第一时间推送,谢谢!

[toc]

前 言

在国产化替代浪潮席卷各行各业的背景下,数据库作为信息系统的核心基石,其兼容性与稳定性成为企业迁移决策的关键考量。电科金仓作为国产数据库的领军企业,今年初推出的 KingbaseES(SQL Server兼容版)凭借 95% 以上的语法兼容能力,成为众多企业替代 SQL Server 数据库的重要选择。在政企、金融、医疗等关键领域,SQL Server 存量系统依旧庞大——据 IDC 2024 报告,国内仍有 21.6% 的核心跑在 SQL Server 上。今天借着金仓 2025 产品体验官活动的机会,本文基于实际测试体验,从安装部署到核心功能兼容性,来体验一下。

一、产品定位与核心价值:为何选择 SQL Server 兼容版?

金仓数据库 KingbaseES 作为国产数据库的 “老兵”,其 SQL Server 兼容版并非简单的语法模仿,而是从架构层面实现了对 SQL Server 生态的深度适配。根据官方资料及实测验证,其核心价值体现在三方面:

1. 降低迁移成本
通过对 T-SQL 语法、系统视图、存储过程等核心组件的兼容,目前官方号称兼容 95% 以上的语法,可以大幅度减少应用代码修改量。

2. 适配信创全栈
产品深度兼容鲲鹏、龙芯等国产 CPU,以及麒麟、统信 UOS 等操作系统,通过了多项信创认证。在国产化硬件环境中,其性能表现与 SQL Server 在 x86 架构下的水平相当,部分场景(如高并发读写)甚至更优。

3.工具链生态完善

提供KDTS一键迁移工具、KFS、KStudio集成开发环境,实现从迁移到运维的全生命周期支持。

二、安装部署:便捷性与环境适配

大概在去年9月份写过一篇单机安装最佳实践《国产数据库|中电科金仓 KES 单机安装最佳实践》,这版 SQL Server 兼容性安装几乎一样,这里就不具体写安装过程了。我们可从官方网站下载 SQL Server 兼容版安装镜像和 90 天的授权文件 KES V9R004C012,https://www.kingbase.com.cn/download.html

KingbaseES_V009R004C012B0006_Lin64_install.iso --发布日期2025-05-15,适用于通用x86_64系列CPU等硬件平台、Linux系统软件环境 license_sqlserver.dat --KingbaseES数据库(SQLServer兼容版)授权文件时长限制为90天,以数据库首次启动为首日开始计算

2.1 环境准备与系统配置

测试环境基于 x86 CentOS 7.6,金仓提供了系统优化脚本 optimize_system_conf.sh,执行此脚本完成五项OS核心配置:

[root@jiekexu1 install]# bash optimize_system_conf.sh This tool help use to make a base optimization for system 1.optimize system core configuration: optimize system core conf 2.optimize limit: optimize limit configuration 20-nproc modifing 3.check limit: open files (-n) 65536 4.disable selinux: 5.disable firewall firewall is disabled.

主要优化内容:

  • 系统参数优化:通过修改/etc/sysctl.conf设置信号量(kernel.sem=5010 64128000 50100 1280)、文件句柄上限(fs.file-max=7672460)等内核参数,确保数据库资源调度效率。
  • 用户权限配置:创建独立的kingbase用户及用户组,通过/etc/security/limits.conf设置最大文件句柄数(65535)和进程数(65536),避免权限不足导致的启动失败。

更多检查命令

grep '^[a-zA-Z]' /etc/sysctl.conf grep '^[a-zA-Z]' /etc/security/limits.conf grep kingbase /etc/shadow systemctl status firewalld.service cat /etc/security/limits.conf

2.2 安装过程与体验

# 1. 挂载介质 mount KingbaseES_V009R004C012B0006_Lin64_install.iso /mnt # 2. 创建目录 mkdir -p /data/Kingbase/ES/V9 mkdir -p /data/Kingbase/data chown -R kingbase:kingbase /data/Kingbase ll /data/Kingbase/ total 0 drwxr-xr-x 2 kingbase kingbase 6 Jul 26 23:30 data drwxr-xr-x 3 kingbase kingbase 16 Jul 26 23:30 ES # 3. 命令行安装到 /opt/kingbase su - kingbase echo $LANG export LANG=zh_CN.UTF-8 cd /mnt sh setup.sh -i console

image20250726232620874.png

安装支持图形化与命令行,静默安装,三种模式,本次测试选择命令行方式:

  1. 挂载镜像文件并执行sh setup.sh -i console,通过交互式界面选择安装路径(/data/Kingbase/ES/V9)、数据目录(建议独立挂载至/data/Kingbase/data`分区)。
  2. 关键配置项包括:数据库端口(默认54321)、字符集(推荐UTF8)、兼容模式(默认选择“SQL Server”)、存储块大小(默认8k)、选择身份认证方法(scram-sha-256)。
  3. 安装完成后执行root.sh脚本注册系统服务,通过sys_ctl start启动数据库,整个过程耗时约5分钟,较SQL Server 安装步骤更简洁。
[kingbase@jiekexu1 install]$ echo $LANG en_US.UTF-8 [kingbase@jiekexu1 install]$ export LANG=zh_CN.UTF-8 [kingbase@jiekexu1 install]$ cd /mnt [kingbase@jiekexu1 mnt]$ sh setup.sh -i console Now launch installer... Preparing to install Extracting the JRE from the installer archive... Unpacking the JRE... Extracting the installation resources from the installer archive... Configuring the installer for this system's environment... Verifying JVM........ Launching installer... =============================================================================== KingbaseES V9 (使用 InstallAnywhere 创建) ------------------------------------------------------------------------------- 正在准备控制台模式安装... =============================================================================== 请稍候 --- =============================================================================== 简介 -- 本安装程序将指导您完成 KingbaseES V9 的安装。 建议您在继续本次安装前,退出所有程序。 如果要回到前一屏幕进行更改,可输入“back”。 如果要取消本次安装,可随时输入“quit”。 KingbaseES Version: V9 Kingbase Type:BMJ-NO Installer Version: V009R004C012 Install DATE:202507261125 Kingbase Inc. http://www.kingbase.com.cn 请按 <ENTER> 键继续: =============================================================================== 请稍候 --- =============================================================================== 许可协议 ---- 安装和使用 KingbaseES V9 产品之前,您须接受下列许可协议: 是否接受此许可协议条款? (Y/N): Y =============================================================================== 选择安装集 ----- 请选择将由本安装程序安装的“安装集”。 ->1- 完全安装 2- 客户端安装 3- 定制安装 输入“安装集”的号码,或按 <ENTER> 键以接受缺省值 : 1 =============================================================================== 请稍候 --- =============================================================================== 选择授权文件 ------ 不选择授权文件,则使用软件自带试用版授权 提示:请在有效期内及时更换正式授权文件。 文件路径 : /install/license_sqlserver.dat License序列号 --- 启用 --- 9A93BE5C-D15D-11EF-8CB3-000C29CBE49F 生产日期 --- 启用 --- 2025-01-13 产品名称 --- 启用 --- KingbaseES 细分版本模板名 --- 启用 --- SALES-企业版 产品版本号 --- 启用 --- V009R004C 浮动基准日期 ------ 启用 有效期间 --- 启用 --- 90 用户名称 --- 启用 --- SQLServer试用授权 项目名称 --- 启用 --- SQLServer试用授权 CPU检查 --- 启用 --- 0 容器名称 --- 禁用 --- 0 MAC地址 --- 启用 --- 00:00:00:00:00:00 最大连接数 --- 启用 --- 0 分区 --- 启用 --- 0 物理同步 --- 启用 --- 0 读写分离模块 --- 启用 --- 0 恢复到指定时间点 --- 启用 --- 0 集群对网络故障的容错 --- 启用 --- 0 快速加载 --- 启用 --- 0 日志压缩 --- 启用 --- 0 全文检索 --- 启用 --- 0 性能优化包(性能诊断) --- 启用 --- 0 性能优化包(性能调优) --- 启用 --- 0 保密通讯协议 --- 启用 --- 0 审计 --- 启用 --- 0 三权分立 --- 启用 --- 0 透明加密 --- 启用 --- 0 强制访问控制 --- 启用 --- 0 列加密 --- 启用 --- 0 密码复杂度 --- 启用 --- 0 用户锁定 --- 启用 --- 0 集群管理软件 --- 启用 --- 0 集群配置工具 --- 启用 --- 0 集群高级管理包 --- 启用 --- 0 并行查询 --- 启用 --- 0 并行备份还原 --- 启用 --- 0 异构数据源 --- 启用 --- 0 日志解析 --- 启用 --- 0 GIS --- 启用 --- 0 日志解析为SQL --- 启用 --- 0 操作系统类型 --- 启用 --- 0 数据守护集群 --- 启用 --- 0 多活共享存储集群 --- 启用 --- 0 数据库模式 --- 启用 --- sqlserver =============================================================================== 选择安装目录 ------ 请选择一个安装目录。 您想在哪一位置安装? 缺省安装文件夹: /opt/Kingbase/ES/V9 输入一个绝对路径,或按 <ENTER> 键以接受缺省路径 : /data/Kingbase/ES/V9 安装文件夹为: /data/Kingbase/ES/V9 是否正确? (Y/N): Y =============================================================================== 预安装摘要 ----- 在继续执行前请检查以下信息: 产品名: KingbaseES V9 安装文件夹: /data/Kingbase/ES/V9 产品功能部件: 数据库服务器, 接口, 数据库部署工具, 数据库开发管理工具, 数据迁移工具 安装空间磁盘信息 所需磁盘空间: 5112 MB 空闲磁盘空间: 26937 MB 请按 <ENTER> 键继续: =============================================================================== 准备就绪,可以安装 --------- 本安装程序已准备完毕,可在下列位置安装 KingbaseES V9: /data/Kingbase/ES/V9 按 <ENTER> 键进行安装: =============================================================================== 正在安装... ------- [==================|==================|==================|==================] 选择存储数据的文件夹 ---------- 请选择一个文件夹,该文件夹必须为空。 Data folder (默认﹕ /data/Kingbase/ES/V9/data): /data/Kingbase/data =============================================================================== 请稍候 --- =============================================================================== 数据库端口 ----- 请输入数据库服务监听端口,默认54321。 端口 (默认﹕ 54321): =============================================================================== 数据库管理员 ------ 请输入数据库管理员用户名。 User (默认﹕ system): =============================================================================== 输入密码 ---- 本次安装需输入密码才能继续。 请输入密码: 请输入密码:********* =============================================================================== 再次输入密码 ------ 本次安装需再次输入密码才能继续。 请再次输入密码: 请再次输入密码:********* =============================================================================== 数据库服务字符集 -------- 请输入服务端字符集编码。 1- default ->2- UTF8 3- GBK 4- GB2312 5- GB18030 输入您选择的号码,或按 <ENTER> 键以接受缺省值: =============================================================================== 区域 -- 请输入数据库区域。 1- C ->2- zh_CN.UTF-8 3- en_US.UTF-8 输入您选择的号码,或按 <ENTER> 键以接受缺省值: =============================================================================== 数据库兼容模式 ------- 请输入数据库兼容模式。 ->1- SQL Server 输入您选择的号码,或按 <ENTER> 键以接受缺省值: =============================================================================== 存储块大小 ----- 请输入存储块大小。 ->1- 8k 2- 16k 3- 32k 输入您选择的号码,或按 <ENTER> 键以接受缺省值: =============================================================================== 身份认证方法 ------ 请选择身份认证方法。 ->1- scram-sha-256 2- scram-sm3 3- sm4 4- sm3 输入您选择的号码,或按 <ENTER> 键以接受缺省值: =============================================================================== 自定义参数 ----- 请输入自定义初始化数据库参数。 Custom (默认﹕ ): =============================================================================== 提示 -- 数据库即将被安装,需要花费一些时间,请耐心等待。 请按 <ENTER> 键继续: =============================================================================== 安装完成 ---- 恭喜!KingbaseES V9 已成功地安装到: /data/Kingbase/ES/V9 如果您需要将 KingbaseES V9 注册为系统服务,请运行 /data/Kingbase/ES/V9/install/script/root.sh 按 <ENTER> 键以退出安装程序: Complete. [root@jiekexu1 ~]# /data/Kingbase/ES/V9/install/script/root.sh Starting KingbaseES V9: waiting for server to start.... done server started KingbaseES V9 started successfully [root@jiekexu1 ~]# ps -ef | grep kingbase root 13130 12214 0 23:12 pts/1 00:00:00 su - kingbase kingbase 13131 13130 0 23:12 pts/1 00:00:00 -bash kingbase 20070 1 0 23:40 ? 00:00:00 /data/Kingbase/ES/V9/KESRealPro/V009R004C012/Server/bin/kingbase -D /data/Kingbase/data kingbase 20072 20070 0 23:40 ? 00:00:00 kingbase: logger kingbase 20074 20070 0 23:40 ? 00:00:00 kingbase: checkpointer kingbase 20075 20070 0 23:40 ? 00:00:00 kingbase: background writer kingbase 20076 20070 0 23:40 ? 00:00:00 kingbase: walwriter kingbase 20077 20070 0 23:40 ? 00:00:00 kingbase: autovacuum launcher kingbase 20078 20070 0 23:40 ? 00:00:00 kingbase: stats collector kingbase 20079 20070 0 23:40 ? 00:00:00 kingbase: kwr collector kingbase 20080 20070 0 23:40 ? 00:00:00 kingbase: ksh writer kingbase 20081 20070 0 23:40 ? 00:00:00 kingbase: ksh collector kingbase 20082 20070 0 23:40 ? 00:00:00 kingbase: logical replication launcher root 20706 9549 0 23:42 pts/0 00:00:00 grep --color=auto kingbase [root@jiekexu1 ~]# systemctl list-dependencies | grep kingbase ● ├─kingbased.service ● ├─kingbased.service

设置环境变量登录数据库

vi .bash_profile export PATH=/data/Kingbase/ES/V9/Server/bin:$PATH export KINGBASE_HOME=/data/Kingbase/ES/V9 export KINGBASE_DATA=/data/KingbaseES/V9/data export KINGBASE_PORT=54321 [kingbase@jiekexu1 ~]$ . .bash_profile [kingbase@jiekexu1 ~]$ ksql -U SYSTEM -d test Password for user SYSTEM: Licesen Type: SALES-企业版. Type "help" for help. test=# select version(); version ------------------------- KingbaseES V009R004C012 (1 row) test=# show database_mode; database_mode --------------- sqlserver (1 row)

图片.png

接下来可以愉快的测试玩耍了,这里提供一个在线的 SQL Server 环境(https://sqlfiddle.com/sql-server/online-compiler)可以进行相关语法的对比验证。

三、兼容性测试:从基础功能到复杂场景

3.1 数据类型兼容:覆盖核心场景

3.1.1 序列测试

create sequence seqno1 as int start with 1 increment by 1; --SQL Server 语法 select next value for seqno1; --KES select nextval('seqno1'); $ ksql -U SYSTEM -d test test=# show database_mode; database_mode --------------- sqlserver (1 row) test=# create sequence seqno1 as int test-# start with 1 test-# increment by 1; CREATE SEQUENCE test=# select next value for seqno1; ERROR: syntax error at or near "seqno1" LINE 1: select next value for seqno1; ^ test=# select nextval('seqno1'); nextval --------- 1 (1 row)

图片.png

3.1.2 数据类型测试

create table t_datatype( id int, rowvers rowversion, sqlvari sql_variant, uid UNIQUEIDENTIFIER DEFAULT NEWID() PRIMARY KEY, sname sysname, MyXMLColumn xml ); insert into t_datatype(id,sqlvari,sname,MyXMLColumn) values(1,45,'seqno1','<root><element1>Value1</element1><element2>Value2</element2></root>'); insert into t_datatype(id,sqlvari,sname,MyXMLColumn) values(2,23,'seqno1','<root><element1>Value3</element1><element2>Value4</element2></root>'); select * from t_datatype;

image20250727233232767.png

test=# create table t_datatype( test(# id int, test(# rowvers rowversion, test(# sqlvari sql_variant, test(# uid UNIQUEIDENTIFIER DEFAULT NEWID() PRIMARY KEY, test(# sname sysname, test(# MyXMLColumn xml test(# ); CREATE TABLE test=# insert into t_datatype(id,sqlvari,sname,MyXMLColumn) test-# values(1,0x0345,'seqno1','<root><element1>Value1</element1><element2>Value2</element2></root>'); ERROR: test or kingbase database not support use rowversion type and correlative functions. test=# create table t_datatype1( test(# id int, test(# sqlvari sql_variant, test(# uid UNIQUEIDENTIFIER DEFAULT NEWID() PRIMARY KEY, test(# sname sysname, test(# MyXMLColumn xml test(# ); CREATE TABLE test=# insert into t_datatype1(id,sqlvari,sname,MyXMLColumn) test-# values(1,45,'seqno1','<root><element1>Value1</element1><element2>Value2</element2></root>'); INSERT 0 1 test=# insert into t_datatype1(id,sqlvari,sname,MyXMLColumn) test-# values(2,23,'seqno1','<root><element1>Value3</element1><element2>Value4</element2></root>'); INSERT 0 1 test=# select * from t_datatype1; id | sqlvari | uid | sname | MyXMLColumn ----+---------+--------------------------------------+--------+--------------------------------------------------------------- ------ 1 | 45 | 933FE8D4-DDB6-497B-BBE0-AAB0643D9386 | seqno1 | <root><element1>Value1</element1><element2>Value2</element2></ root> 2 | 23 | FB50FC57-6F0A-41E8-95A5-D3C8F4F04E2D | seqno1 | <root><element1>Value3</element1><element2>Value4</element2></ root> (2 rows)

图片.png

测试针对SQL Server特有数据类型进行验证,结果如下:

数据类型 兼容情况 测试案例
ROWVERSION 部分兼容 创建含ROWVERSION字段的表,无法直接插入数据,与 SQL Server 行为不一致。
SQL_VARIANT 完全兼容 支持SQL_VARIANT类型。
UNIQUEIDENTIFIER 完全兼容 支持NEWID()生成GUID。
SYSNAME 完全兼容 等价于NVARCHAR(128),适用于存储对象名称,大小写不敏感特性符合预期。

结论:核心数据类型实现无缝兼容,满足绝大多数业务场景;复杂解析需谨慎迁移,建议通过应用层处理替代数据库内解析。

3.2 SQL语法与对象兼容:细节见真章

3.2.1 基础语法与函数

## TOP 语法 insert into t_datatype1(id,sqlvari,sname,MyXMLColumn) values(3,'2','seqno1','<root><element1>Value5</element1><element2>Value6</element2></root>'); select top 2 * from t_datatype1; test=# select top 2 * from t_datatype1; id | sqlvari | uid | sname | MyXMLColumn ----+---------+--------------------------------------+--------+--------------------------------------------------------------- ------ 1 | 45 | 933FE8D4-DDB6-497B-BBE0-AAB0643D9386 | seqno1 | <root><element1>Value1</element1><element2>Value2</element2></ root> 2 | 23 | FB50FC57-6F0A-41E8-95A5-D3C8F4F04E2D | seqno1 | <root><element1>Value3</element1><element2>Value4</element2></ root> (2 rows) test=# select top 1 percent * from t_datatype1; id | sqlvari | uid | sname | MyXMLColumn ----+---------+--------------------------------------+--------+--------------------------------------------------------------- ------ 1 | 45 | 933FE8D4-DDB6-497B-BBE0-AAB0643D9386 | seqno1 | <root><element1>Value1</element1><element2>Value2</element2></ root> (1 row) ## 事务控制 test=# SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; WARNING: SET TRANSACTION can only be used in transaction blocks SET test=# BEGIN TRANSACTION; BEGIN test=# select * from t_datatype1; id | sqlvari | uid | sname | MyXMLColumn ----+---------+--------------------------------------+--------+--------------------------------------------------------------- ------ 1 | 45 | 933FE8D4-DDB6-497B-BBE0-AAB0643D9386 | seqno1 | <root><element1>Value1</element1><element2>Value2</element2></ root> 2 | 23 | FB50FC57-6F0A-41E8-95A5-D3C8F4F04E2D | seqno1 | <root><element1>Value3</element1><element2>Value4</element2></ root> 3 | 2 | CB4E07D0-90B4-4BB9-BDC4-36885EE7BAB9 | seqno1 | <root><element1>Value5</element1><element2>Value6</element2></ root> (3 rows) test=# COMMIT; test=# BEGIN TRANSACTION; BEGIN test=# select top 1 percent * from t_datatype1; id | sqlvari | uid | sname | MyXMLColumn ----+---------+--------------------------------------+--------+--------------------------------------------------------------- ------ 1 | 45 | 933FE8D4-DDB6-497B-BBE0-AAB0643D9386 | seqno1 | <root><element1>Value1</element1><element2>Value2</element2></ root> (1 row) test=# ROLLBACK; ROLLBACK test=# SET implicit_transactions ON; SET test=# BEGIN TRANSACTION; BEGIN test=# UPDATE t_datatype1 SET id = 20; UPDATE 3 test=# SELECT @@TRANCOUNT; @@TRANCOUNT ------------- 2 (1 row) ## 游标操作 test=# DECLARE @aa int=2 test-# SELECT @aa test-# DECLARE @bb table(bbb int) test-# INSERT INTO @bb values(111),(222) test-# SELECT * FROM @bb; @aa ----- 2 (1 row) INSERT 0 2 bbb ----- 111 222 (2 rows) declare @dbid int,@dbname sysname declare db_cursor cursor for select database_id,name from sys.databases open db_cursor fetch next from db_cursor into @dbid,@dbname while @@fetch_status = 0 begin select @dbid,@dbname fetch next from db_cursor into @dbid,@dbname end close db_cursor deallocate db_cursor; DECLARE CURSOR @dbid | @dbname -------+----------- 1 | template1 (1 row) @dbid | @dbname -------+----------- 15409 | template0 (1 row) @dbid | @dbname -------+--------- 15410 | tempdb (1 row) @dbid | @dbname -------+--------- 15416 | master (1 row) @dbid | @dbname -------+---------- 15422 | resource (1 row) @dbid | @dbname -------+--------- 15423 | test (1 row) @dbid | @dbname -------+---------- 15424 | kingbase (1 row) @dbid | @dbname -------+---------- 15425 | security (1 row) CLOSE CURSOR ## 内置函数 test=# SELECT GETDATE() AS CurrentDateTime,CHARINDEX('world', 'Hello world!') AS Position,convert(money,12) AS money, test-# CONVERT(varchar(23), getdate(), 120); CurrentDateTime | Position | money | getdate -------------------------+----------+---------+--------------------- 2025-07-28 00:07:13.940 | 7 | 12.0000 | 2025-07-28 00:07:13 (1 row)
  • TOP语法:支持SELECT TOP 2 * FROM tableTOP 1 PERCENT,结果排序与 SQL Server 一致。
  • 事务控制:完全支持BEGIN TRANSACTIONCOMMITROLLBACK,嵌套事务中@@TRANCOUNT变量值正确累加。
  • 游标操作DECLARE CURSORFETCH NEXTDEALLOCATE等语句正常执行,游标类型(静态、动态)行为符合预期。
  • 内置函数GETDATE()CONVERT()CHARINDEX()等 84 个常用函数全部兼容,其中CONVERT(varchar(23), getdate(), 120)日期格式化结果与 SQL Server 完全一致。

3.2.2 复杂对象与扩展语法

## 临时表 -- 创建局部临时表 CREATE TABLE #tmp ( id int ); -- 创建全局临时表 CREATE TABLE ##tmp ( id int ); --master 数据库: --记录了所有系统级信息,包括实例范围的元数据(例如登录帐户)、端点、链接服务器和系统配置设置。 --系统对象不存在 master 数据库中,而是存储在 Resource 数据库中。 --此外,master 数据库还记录了所有其他数据库的存在、数据库文件的位置以及数据库的初始化信息。 --创建数据库,只能在master库中执行。 kingbase=# create database testdb1; ERROR: can not create database in current database. kingbase=# \c master You are now connected to database "master" as userName "SYSTEM". master=# create database testdb1; CREATE DATABASE master=# CREATE TABLE #tmp ( master(# id int master(# ); CREATE TABLE master=# CREATE TABLE ##tmp ( master(# id int master(# ); CREATE TABLE master=# select * from #tmp; id ---- (0 rows) master=# SELECT object_id('tempdb.dbo.#tmp') master-# ; object_id ----------- 16429 (1 row) ## 存储过程与函数 \set SQLTERM go DROP FUNCTION IF EXISTS dbo.return_func; GO CREATE FUNCTION dbo.return_func0() RETURNS INT AS BEGIN RETURN 12; END; GO CREATE OR ALTER PROCEDURE return_proc0 AS BEGIN RETURN 2 + dbo.return_func0(); END; GO DECLARE @res INT; EXEC @res = return_proc0; SELECT @res; -- @res 为 14 GO -- exec 语法 \set SQLTERM go CREATE OR ALTER PROCEDURE proc_one_default_arg @i int = 1 AS BEGIN PRINT 'proc not have one arg'; END; GO --传参使用默认值 EXEC proc_one_default_arg; GO --使用default关键字传入默认值 EXEC proc_one_default_arg default; GO --使用命名传参和default关键字传入默认值 EXEC proc_one_default_arg @i = default; GO testdb1=# create database testdb2; CREATE DATABASE testdb1=# \c testdb2 You are now connected to database "testdb2" as userName "SYSTEM". testdb2=# \set SQLTERM go testdb2=# DROP FUNCTION IF EXISTS dbo.return_func; testdb2-# GO NOTICE: function dbo.return_func() does not exist, skipping DROP FUNCTION testdb2=# CREATE FUNCTION dbo.return_func0() RETURNS INT AS testdb2-# BEGIN testdb2-# RETURN 12; testdb2-# END; testdb2-# GO CREATE FUNCTION testdb2=# CREATE OR ALTER PROCEDURE return_proc0 AS testdb2-# BEGIN testdb2-# RETURN 2 + dbo.return_func0(); testdb2-# END; testdb2-# GO CREATE PROCEDURE testdb2=# DECLARE @res INT; testdb2-# EXEC @res = return_proc0; testdb2-# SELECT @res; -- @res 为 14 testdb2-# GO @res ------ 14 (1 row) testdb2=# select * from STRING_SPLIT('a,b,c',','); value ------- a b c (3 rows) ### 跨库查询 testdb1=# create table t1(id int); CREATE TABLE testdb1=# insert into t1 values (1),(2); INSERT 0 2 testdb1=# \c testdb2 You are now connected to database "testdb2" as userName "SYSTEM". testdb2=# select * from testdb1.dbo.t1; id ---- 1 2 (2 rows) ## FOR XML CREATE TABLE test_xml ( id INT PRIMARY KEY, version ROWVERSION ); INSERT INTO test_xml (id) VALUES (1); SELECT id FROM test_xml FOR XML PATH('row'); xml ----------------------- <row><id>1</id></row> (1 row) --json declare @JSON varchar(max) set @JSON='{ "sites": [ { "name":"kingbase" , "url":"https://bbs.kingbase.com.cn" } ] }' select * from openjson(@JSON);
  • 临时表:局部临时表和全局临时表创建、查询、删除正常。
  • 存储过程与函数:支持RETURN返回值、表值函数,EXEC动态执行SQL语句无语法报错。
  • 跨库查询:通过[数据库名].[dbo].[表名]语法实现跨库访问,性能与同库查询持平。
  • FOR XML:基础FOR XML PATH('row')可生成预期XML结构,但TYPE指令返回类型与SQL Server存在差异。

待改进点

  • 序列语法不支持NEXT VALUE FOR testseq1,需改用nextval('testseq1')
  • JSON函数(如OPENJSON)暂不支持,需通过应用层解析JSON字符串。
    image20250728230209329.png

3.3 事务与并发控制:稳定性验证

--隔离级别 SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; SET TRANSACTION ISOLATION LEVEL READ COMMITTED; SET TRANSACTION ISOLATION LEVEL REPEATABLE READ; SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; --锁机制 BEGIN TRANSACTION; SELECT * FROM test_xml WHERE id = 1 FOR UPDATE NOWAIT; -- 或者 SELECT * FROM test_xml WHERE id = 1 FOR UPDATE SKIP LOCKED; --索引重建 testdb2=# \d+ test_xml Table "dbo.test_xml" Column | Type | Collation | Nullable | Default | Storage | Stats target | Description ---------+------------+-----------+----------+---------+---------+--------------+------------- id | int | | not null | | plain | | version | rowversion | | not null | | plain | | Indexes: "test_xml_pkey" PRIMARY KEY, btree (id NULLS FIRST) Access method: heap testdb2=# alter index test_xml_pkey on test_xml rebuild; WARNING: Does not verify whether index is related to table LINE 1: alter index test_xml_pkey on test_xml rebuild; ^ REINDEX testdb2=#

image20250728233146386.png

测试通过多线程并发更新场景验证隔离级别与锁机制:

  • 隔离级别READ COMMITTED(默认)、READ UNCOMMITTEDREPEATABLE READSERIALIZABLE均正常生效,SERIALIZABLE级别可有效避免幻读。
  • 锁机制FOR UPDATE NOWAIT在锁定冲突时立即返回错误,SKIP LOCKED跳过锁定行,行为与SQL Server的UPDLOCK + READPAST等价。
  • 索引重建ALTER INDEX idx_test REBUILD可正常执行,虽提示“不验证索引与表关联”警告,但重建成功。

结论:事务与并发控制逻辑稳定,满足高并发业务场景需求,锁机制实现方式略有差异但结果一致。

四、结语:国产数据库的“SQL Server 时刻”

十年前,MySQL 用“LAMP”终结了小型机的 Web 场景;
五年前,PostgreSQL 用“兼容 Oracle”撕开了去 O 的口子;
今天,KingbaseES 用 95 % 的 SQL Server 兼容 + 230 万 tpmC + 一键迁移 宣告:
国产数据库已经具备接管 SQL Server 核心系统的能力。

对于甲方,这意味着:

  • 迁移风险从“不可控”降为“可灰度”。
  • 软件授权成本下降 50 % 以上。
  • 不再被单一厂商锁死,获得持续演进的主动权。

对于 DBA,这意味着:

  • T-SQL 技能无需重置,经验资产得以复用。
  • 智能运维(AI 优化器 + KEMCC)让“救火”变“设计”。
  • 成为国产技术栈落地的关键推手,个人价值跃迁。

国产化不是选择题,而是时代题。
KingbaseES(SQL Server 兼容版)已经给出了一份高分答卷,接下来,就看我们如何落笔。

五、参考链接

https://bbs.kingbase.com.cn/docHtml?recId=bf40609a9c064fe3593c2040d4d899c8&url=aHR0cHM6Ly9iYnMua2luZ2Jhc2UuY29tLmNuL2tpbmdiYXNlLWRvYy92OS40LjEyL2ludHJvL3JlbGVhc2Vub3Rlcy1leHRlcm5hbC12OS9pbmRleC5odG1s https://bbs.kingbase.com.cn/docHtml?recId=bf40609a9c064fe3593c2040d4d899c8&amp;url=aHR0cHM6Ly9iYnMua2luZ2Jhc2UuY29tLmNuL2tpbmdiYXNlLWRvYy92OS40LjEyL2luc3RhbGwtdXBkYXRhL2luc3RhbGwtbGludXgvaW5kZXguaHRtbA https://www.kingbase.com.cn/download.html https://sqlfiddle.com/sql-server/online-compiler https://onecompiler.com/sqlserver/ https://bbs.kingbase.com.cn/blogDetail?postsId=514210f42a8c01f90d4a026eb0722586 https://bbs.kingbase.com.cn/blogDetail?postsId=00f7966489ce6826816900309fb42e23

全文完,希望可以帮到正在阅读的你,如果觉得有帮助,可以分享给你身边的朋友,同事,你关心谁就分享给谁,一起学习共同进步~~~

欢迎关注我的公众号【JiekeXu DBA之路】,一起学习新知识!
——————————————————————————
公众号:JiekeXu DBA之路
墨天轮:https://www.modb.pro/u/4347
CSDN :https://blog.csdn.net/JiekeXu
ITPUB:https://blog.itpub.net/69968215
腾讯云:https://cloud.tencent.com/developer/user/5645107
——————————————————————————

facebook_pro_light_1920 × 1080  副本.png

最后修改时间:2025-07-29 10:16:03
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论