我正在编写一些代码来查询一些DMV。某些列可能存在于 DMV 中,也可能不存在,具体取决于 SQL 版本。我在网上发现了一个有趣的建议,如何使用跳过特定检查CROSS APPLY
.
下面的查询是读取 DMV 中可能缺失的列的代码示例。该代码为该列创建一个默认值并使用CROSS APPLY
从 DMV 中提取实际列(如果存在)。
代码尝试提取的列 BogusColumn 不存在。我希望下面的查询会生成有关无效列名的错误...但事实并非如此。它返回 NULL,没有错误。
为什么下面的 CROSS APPLY 子句不会导致“无效的列名”错误?
declare @x int
select @x = b.BogusColumn
from
(
select cast(null as int) as BogusColumn
) a
cross apply
(
select BogusColumn from sys.dm_exec_sessions
) b;
select @x;
如果我在CROSS APPLY
分别地:
select BogusColumn from sys.dm_exec_sessions;
我收到有关无效列名的预期错误:
Msg 207, Level 16, State 1, Line 9
Invalid column name 'BogusColumn'.
如果我将 DMV 列名称更改为 BogusColumn2 以使其唯一,则会收到预期的列名称错误:
select a.BogusColumn1, b.BogusColumn2
from
(
select cast(null as int) as BogusColumn1
) a
cross apply
(
select BogusColumn2 from sys.dm_exec_sessions
) b
我已在 SQL 2012 到 SQL 2017 版本上测试了此行为,并且该行为在所有版本中都是一致的。