T-SQL:IF 内的 Alter Database 语句失败

T-SQL : Alter Database statement inside IF is failing

我们有一个场景,我们必须根据 SQL 服务器版本更改数据库兼容性,我们在下面写了相同的条件。

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
Valid values of the database compatibility level are 100, 110, or 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 但实际上脚本是 运行 on SQL Server 2014 .

这是解析错误; SQL 服务器正在解析您想要的级别 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;