Azure SQL DB中IF EXISTS分支列引用预编译报错问题咨询
解决Azure SQL DB中列存在判断分支的编译错误问题
Azure SQL DB的查询优化器会在执行前对整个批处理做对象存在性校验,不管分支是否会实际执行。所以你的原代码里,即使IF EXISTS判断结果为假,真分支里的MickeyMouse列引用还是会被提前检查,导致报错。本地SQL Server因为延迟编译机制,只编译实际运行的分支,所以不会出现这个问题。
解决方法是用动态SQL,把引用目标列的逻辑放到动态执行的语句中,这样只有当列存在时才会编译执行这段代码,避免提前校验:
IF EXISTS ( SELECT 1 FROM sys.columns WHERE Name = N'MickeyMouse' AND Object_ID = Object_ID(N'dbo.DisneyLand') ) BEGIN DECLARE @DynamicSQL NVARCHAR(MAX) = N' DECLARE @TEST DATETIME = (SELECT TOP 1 MickeyMouse FROM DisneyLand) SELECT ''Column MickeyMouse exists'' ' EXEC sp_executesql @DynamicSQL END ELSE BEGIN SELECT 'Column MickeyMouse does not exist' END
这段代码的逻辑是:当检测到列存在时,才构造并执行包含该列引用的动态SQL;列不存在时直接返回提示,不会触发对MickeyMouse列的校验。
内容的提问来源于stack exchange,提问作者Rich
相关产品推荐
相关产品推荐

