一、測試說明
KES數據庫已經兼容了 SQL Server,如在 SQL 特殊數據類型與對象,SQL 語句,T-SQL 語法、存儲過程調用的兼容性上都很高。
本次我們就來測試常見的 T-SQL 語法的兼容性:
- 批處理語句 GO
- 打印語句 PRINT
- 錯誤處理語句 RAISEERROR
- THROW
- SQL 語法特性,分號和逗號
二、下載并安裝SQL Server 兼容版KES數據庫
下載地址
https://www.kingbase.com.cn/download.html

該版本新增了對SQLServer若干系統視圖和內置函數的支持,支持ICU庫并對其進行了優化;支持更多的高級查詢功能,包括FOR XML子句、PIVOT行列轉換操作、GROUP BY子句中基于不同數據類型進行分組、DINSTICT子句與ORDER BY聯合中列別名的使用等;新增DML操作觸發更新統計信息功能,提升查詢性能與增強系統的穩定性;新增臨時表優化功能,提升了函數執行效率。在客戶端編程接口方面,.Net驅動中新增了對SQL Server 中一些日期函數的支持,加入了更多針對各行業應用場景的定制化功能,助力企業實現平滑遷移和業務高效運行。
下載授權文件
KingbaseES數據庫(SQLServer兼容版)授權文件時長限制為90天,以數據庫首次啟動為首日開始計算。

三、兼容性測試 SQL Server T-SQL 語句
3.1、批處理語句
1. 含義
批處理語句是指將多條 T-SQL 語句組合在一起,作為一個整體執行。SQL Server 支持通過分號(;)分隔多條語句,或者使用 GO 關鍵字分隔批處理。
2. 語法
-
使用分號分隔
SELECT * FROM Table1;
SELECT * FROM Table2; -
使用
GO分隔SELECT * FROM Table1;
GO
SELECT * FROM Table2;
GO
3. 注意事項
- 分號:在 SQL Server 中,分號是語句的結束符,但在某些情況下(如使用
TRY...CATCH或BEGIN...END塊)是必需的。 GO關鍵字:GO不是 T-SQL 的語法,而是 SQL Server Management Studio (SSMS) 和 SQLCMD 工具的批處理分隔符。它不能在存儲過程或函數中使用。- 性能:將多條語句組合成一個批處理可以減少網絡往返時間,提高性能。
4. 實操
示例 1:使用分號分隔
SELECT * FROM Table1;
SELECT * FROM Table2;

示例 2:使用 GO 分隔
SELECT * FROM Table1;
GO
SELECT * FROM Table2;
GO


3.2、PRINT 語句
1. 含義
PRINT 語句用于在 SQL Server 的消息窗口中輸出文本信息。它常用于調試和日志記錄。
2. 語法
PRINT 'message';
message:要輸出的字符串,可以是常量、變量或表達式。
3. 注意事項
- 輸出限制:
PRINT輸出的最大長度為 8000 字符。 - 性能:
PRINT語句不會影響查詢的執行,但過多的PRINT語句可能會影響性能。 - 調試工具:在實際生產環境中,建議使用更專業的日志記錄工具(如 SQL Server 的
ERRORLOG或自定義的日志表)。
4. 實操
示例 1:打印常量字符串
PRINT 'Hello, World!';

示例 2:打印變量值
DECLARE @Message NVARCHAR(100) = 'This is a test message.';
PRINT @Message;

3.3、RAISERROR 語句
1. 含義
RAISERROR 語句用于生成錯誤消息,并將控制權傳遞給 CATCH 塊(如果存在)。它常用于自定義錯誤處理。
2. 語法
RAISERROR ( { msg_id | msg_str } , severity , state [ , argument [ ,...n ] ] );
msg_id:用戶定義的錯誤消息編號。msg_str:自定義錯誤消息。severity:錯誤的嚴重級別(0-25)。state:錯誤的狀態碼(0-255)。argument:可選的參數,用于替換消息中的占位符。
3. 注意事項
- 嚴重級別:嚴重級別為 11-19 的錯誤會觸發
CATCH塊。 - 性能:
RAISERROR會中斷當前的執行流程,因此應謹慎使用。 - 替代:在 SQL Server 2012 及更高版本中,建議使用
THROW語句替代RAISERROR。
4. 實操
示例 1:使用 RAISERROR 拋出自定義錯誤
BEGIN TRY
RAISERROR ('This is a custom error message.', 16, 1);
END TRY
BEGIN CATCH
PRINT 'Error caught: ' + ERROR_MESSAGE();
END CATCH;

3.4、THROW 語句
1. 含義
THROW 語句用于拋出錯誤,并將控制權傳遞給 CATCH 塊(如果存在)。它是 RAISERROR 的替代品,語法更簡潔。
2. 語法
THROW [error_number ,message ,state];
error_number:錯誤編號(可選,默認為 50000)。message:自定義錯誤消息。state:錯誤的狀態碼(可選,默認為 1)。
3. 注意事項
- 兼容性:
THROW語句僅在 SQL Server 2012 及更高版本中可用。 - 性能:與
RAISERROR類似,THROW會中斷當前的執行流程。 - 使用場景:建議在需要拋出自定義錯誤時使用
THROW,而不是RAISERROR。
4. 實操
示例 1:使用 THROW 拋出自定義錯誤
BEGIN TRY
THROW 50001, 'This is a custom error message.', 1;
END TRY
BEGIN CATCH
PRINT 'Error caught: ' + ERROR_MESSAGE();
END CATCH;

3.5、SQL 語句無需分號分隔符
1. 含義
在 SQL Server 中,分號(;)是語句的結束符
2. 測試
BEGIN TRY
SELECT * FROM Table1
SELECT * FROM Table2
END TRY
BEGIN CATCH
PRINT 'Error occurred';
END CATCH;

3.6 創建表時最后一個字段可加逗號
1. 含義
在 SQL Server 中,創建表時,最后一個字段后面可以加逗號,這在某些情況下可以簡化代碼的維護和擴展。
2. 語法
-
最后一個字段加逗號:
CREATE TABLE ExampleTable (
ID INT PRIMARY KEY,
Data NVARCHAR(100),
RowVer ROWVERSION,
); -
最后一個字段不加逗號:
CREATE TABLE ExampleTable (
ID INT PRIMARY KEY,
Data NVARCHAR(100),
RowVer ROWVERSION
);
3. 注意事項
- 語法兼容性:在 SQL Server 中,最后一個字段加逗號是允許的,但在某些其他數據庫管理系統(如 MySQL)中,這種語法可能不被支持。
- 代碼維護:在團隊開發中,統一的代碼風格很重要。如果團隊決定在最后一個字段加逗號,那么所有表的定義都應保持一致。
- 性能影響:這種語法對性能沒有影響,但可以提高代碼的可讀性和可維護性。
4. 實操
示例 1:最后一個字段加逗號
CREATE TABLE ExampleTable (
ID INT PRIMARY KEY,
Data NVARCHAR(100),
RowVer ROWVERSION,
);

示例 2:最后一個字段不加逗號
CREATE TABLE ExampleTable (
ID INT PRIMARY KEY,
Data NVARCHAR(100),
RowVer ROWVERSION
);

總結
工具語句:
- 批處理語句:用于組合多條 T-SQL 語句,提高執行效率。
PRINT語句:用于調試和輸出信息,但不適合生產環境。RAISERROR語句:用于自定義錯誤處理,但在 SQL Server 2012 及更高版本中建議使用THROW。THROW語句:語法更簡潔,是RAISERROR的替代品,適用于 SQL Server 2012 及更高版本。
這些工具語句在 SQL Server 的開發和調試中非常有用,合理使用它們可以提高代碼的可讀性和可維護性。
語法特性:
- SQL 語句無需分號分隔符
- 創建表時最后一個字段可加逗號:
通過合理使用這些特性,可以提高 SQL Server 的開發效率和代碼的可維護性。
五、Windows 安裝 KingBaseES 報錯匯總
1、安裝軟件時,提示初始化數據庫失敗
解決方案
需要把360安全軟件關閉后再執行下一步。
2、無法啟動服務
打開服務 services.msc,找到可執行文件的路徑。

cd D:\Program Files\Kingbase\ES\V9\KESRealPro\V009R004C012\Server\bin
./sys_ctl.exe runservice -N "kingbase9_R1_instance" -D "D:\Program Files\Kingbase\ES\V9\data" -w
sys_ctl: could not start service "kingbase9_R1_instance": error code 1063
./sys_ctl.exe -D "kingbase9_R1_instance" -D "D:\Program Files\Kingbase\ES\V9\data" start
waiting for server to start.....
HKT [18240] LOG: 正在啟動 KingbaseES V009R004C012
HKT [18240] LOG: 正在監聽IPv6地址"::",端口 54321
HKT [18240] LOG: 無法綁定IPv4地址"0.0.0.0": Only one usage of each socket address (protocol/network address/port) is normally permitted.
HKT [18240] HINT: 端口54321上是否已經運行了另一個kingbase?如果沒有,請等待幾秒鐘后重試。
HKT [18240] FATAL: 無法為"*"創建監聽套接字
HKT [18240] LOG: database system is shut down
stopped waiting
sys_ctl: could not start server
Examine the log output.
解決方案
方案 1:查看端口是否被占用
netstat -ano | grep "54321"
kill <進程 id>
方案 2:更改啟動端口
D:\Program Files\Kingbase\ES\V9\data
port=54325
重新啟動,啟動成功,如下圖所示:

查看進程

修改數據庫連接的端口為 54325,連接成功,如下圖所示:

3、無法連接數據庫,報錯亂碼
解決方案
安裝時選擇 utf8 編碼




