我們有一個場景,我們必須根據 SQL Server 版本更改資料庫兼容性,我們為此撰寫了以下條件。
IF @@VERSION LIKE 'Microsoft SQL Server 2016 %'
BEGIN
ALTER DATABASE [AdventureWorks2014]
SET COMPATIBILITY_LEVEL = 130
END
GO
在我們客戶的一臺服務器中,此代碼失敗并出現以下錯誤,并且服務器具有 SQL Server 2014
Msg 15048, Level 16, State 1, Line 4
資料庫兼容級別的有效值為 100、110 或 120。
即即使條件為假,Alter Database陳述句仍在執行。
用下面的代碼測驗了相同的條件并且條件有效,它沒有回傳 NULL,因為服務器有 SQL Server 2014 而不是 2016
IF @@VERSION LIKE 'Microsoft SQL Server 2016 %'
BEGIN
SELECT NULL
END
GO
那么,為什么Alter Database即使條件為假,陳述句也一直在執行呢?
我相信,理想情況下,它甚至不應該輸入或通過 IF 條件,因為它正在檢查 SQL Server 2016,但實際上腳本正在 SQL Server 2014 上運行。
uj5u.com熱心網友回復:
這是決議錯誤;SQL Server 正在決議您想要的級別 130 并在它甚至運行陳述句之前出錯。我可以使用以下命令在舊服務器上復制該問題:
CREATE DATABASE testDB;
GO
IF 1=0
ALTER DATABASE testDB SET COMPATIBILITY_LEVEL = 130;
GO
DROP DATABASE testDB;
請注意,該ALTER DATABASE陳述句永遠不會運行,但這將產生相同的錯誤。
相反,如果需要,可以通過在單獨的范圍內運行來推遲對陳述句的驗證:
CREATE DATABASE testDB;
GO
IF @@VERSION LIKE 'Microsoft SQL Server 2016 %'
EXEC sys.sp_executesql N'ALTER DATABASE testDB SET COMPATIBILITY_LEVEL = 130;';
GO
DROP DATABASE testDB;
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/424992.html
上一篇:不存在的三表連接
