确定 SQL Server 实例的最高或默认兼容性级别

Pet*_*ore 0 t-sql sql-server

是否可以以编程方式确定特定 SQL Server 实例支持的最高兼容性级别,或者至少将数据库级别设置为实例的默认级别,而无需事先知道那是什么?

这里的动机是我之前将所有数据库设置为较早的兼容性级别。现在我想将它们迁移到更高的级别以从新功能中受益,但我不想破坏那些碰巧仍在运行旧版 SQL Server 版本的客户的事情。

ALTER DATABASE会让我选择一个特定的兼容性级别,例如 150,但我看不到一种方法来将其设置为实例的默认级别,或者确定支持的最高级别,除非可能通过一些涉及解析版本号的 hack (虽然这看起来不是特别可靠)。

Cha*_*ace 5

不幸的是,SQL Server 中没有内置的方法来执行此操作。SSMS 和大多数其他工具确实只是解析版本信息。

这是一个可怕的黑客方法,可以从由于提供不正确的兼容性级别而产生的错误消息中获取信息。

BEGIN TRY
    EXEC('
    ALTER DATABASE master
    SET COMPATIBILITY_LEVEL = 0;
    ');
END TRY
BEGIN CATCH
    DECLARE @msg nvarchar(4000) = ERROR_MESSAGE();
    SELECT SUBSTRING(@msg, LEN(@msg) - 3, 3);
END CATCH;
Run Code Online (Sandbox Code Playgroud)

作为参考,消息是这样的,最后一个值是最高的。

Valid values of the database compatibility level are 100, 110, 120, 130, 140, 150 or 160.
Run Code Online (Sandbox Code Playgroud)

2014 年的 db<>fiddle

2022 年的 db<>fiddle