Azure-Sql-Database

如何從 T-SQL 獲取 Azure SQL 數據庫中的預設兼容性級別?

  • May 9, 2021

在本地 SQL Server 中,您可以檢查伺服器版本並乘以 10 以獲得伺服器支持的最大兼容級別,或者檢查模型數據庫的兼容級別以獲得將創建的新數據庫的預設兼容級別。

在 Azure SQL 數據庫中,這些都不起作用;即使最大兼容級別為 140,伺服器版本仍保持在 12,並且沒有要檢查的模型數據庫。

如何從 T-SQL 中找出 Azure SQL 數據庫中目前的預設兼容性級別?換句話說,我想要一個 T-SQL 查詢,如果在2018 年 1 月 18 日之前執行將返回 130 ,如果在今天執行則返回 140,並且每當 Azure 更新到預設兼容級別 150 時將返回 150。

我找不到為此專門記錄的任何內容,但是:

SELECT SERVERPROPERTY('ResourceVersion');

…目前為 Azure SQL 數據庫返回“15.00.2000”,這可能對您有用。

我原以為你可以查詢:

SELECT H.[name]
FROM sys.dm_exec_valid_use_hints AS H 
WHERE H.name LIKE N'QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_%';

…但返回:

…這些都是有效的提示,但 150 是您在撰寫本文時可以將數據庫兼容性設置為的最大值。

我知道沒有一種干淨的方法。您可以嘗試逐步設置它們,然後查看最終值是多少。這將返回目前最大值:

DECLARE @SQL NVARCHAR(MAX)
SET @SQL = 'ALTER DATABASE '+DB_NAME()+' SET COMPATIBILITY_LEVEL = 130'; EXEC (@SQL)
SET @SQL = 'ALTER DATABASE '+DB_NAME()+' SET COMPATIBILITY_LEVEL = 140'; EXEC (@SQL)
SET @SQL = 'ALTER DATABASE '+DB_NAME()+' SET COMPATIBILITY_LEVEL = 150'; EXEC (@SQL)
SET @SQL = 'ALTER DATABASE '+DB_NAME()+' SET COMPATIBILITY_LEVEL = 160'; EXEC (@SQL)
SET @SQL = 'ALTER DATABASE '+DB_NAME()+' SET COMPATIBILITY_LEVEL = 170'; EXEC (@SQL)
SELECT compatibility_level FROM sys.databases WHERE name = DB_NAME()
-- currently returns compatibility_level=150

顯然,您不想在活動的應用程序數據庫上執行此操作,因為更改級別可能會對應用程序使用者產生影響。

上面的測試使用了 ad-hoc SQL,因為否則以後的版本會在語法檢查失敗的情況下甚至沒有嘗試其餘部分,並且您必須對數據庫名稱進行硬編碼。在 SSMS 或類似中,您可以通過將批處理分成多個來解決第一個問題:

ALTER DATABASE test_clvl SET COMPATIBILITY_LEVEL = 130
GO
ALTER DATABASE test_clvl SET COMPATIBILITY_LEVEL = 140
GO
ALTER DATABASE test_clvl SET COMPATIBILITY_LEVEL = 150
GO
ALTER DATABASE test_clvl SET COMPATIBILITY_LEVEL = 160
GO
ALTER DATABASE test_clvl SET COMPATIBILITY_LEVEL = 170
GO
SELECT compatibility_level FROM sys.databases WHERE name = DB_NAME()

如果您可以使用外部工具,則編寫數據庫創建腳本,然後從 master.sys.databases 中找到級別,然後使用 powershell 或類似工具刪除測試數據庫。

在任何情況下,您都需要忽略對更高版本的錯誤響應。也許TRY/CATCH可以使這個更清潔,但我會讓你玩這個。

引用自:https://dba.stackexchange.com/questions/252645