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;
我们有一个场景,我们必须根据 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;