为什么 CROSS APPLY *不*在此查询中出现无效列错误?

2024-02-18

我正在编写一些代码来查询一些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 版本上测试了此行为,并且该行为在所有版本中都是一致的。


BogusColumn 被定义为第一个查询中的有效列。

当我们应用交叉应用时,它使用列分辨率,如下所示:
1. 它在第二个查询 (dmv) 中查找“BogusColumn”列
2.如果dmv中存在该列,则解析为dmv
3. 如果 dmv 中不存在该列,它将在外部查询(顶部查询)中查找该列并使用那里提供的值。

换句话说,当视图中未定义虚假列时,最终查询将按以下方式工作:

select * from
(
    select cast(null as int) as BogusColumn
) a
cross apply
(
    select a.BogusColumn AS BogusColumn from sys.dm_exec_sessions
) b;

如果已定义,查询将解析为:

select * from
(
    select cast(null as int) as BogusColumn
) a
cross apply
(
    select s.BogusColumn AS BogusColumn from sys.dm_exec_sessions as s
) b;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 CROSS APPLY *不*在此查询中出现无效列错误? 的相关文章

随机推荐

  • 如何将安装(框架+应用程序)打包到一个可执行文件中?

    我想创建一个文件 setup exe 其中包含我用 C 开发的一个应用程序以及 Net Framework 4 0 的安装程序 这个想法是 当我执行 setup exe 时 它会检查计算机上是否安装了 net Framework 4 0 如
  • pd.merge() 和 dataframe.merge() 之间的区别

    我想知道当你合并时有什么区别pd merge versus dataframe merge 示例如下 pd merge dataframe1 dataframe2 and dataframe1 merge dataframe2 我们有两个函
  • 将纬度和经度值(度)转换为 Double 。爪哇

    我正在尝试将以度为单位的纬度和经度值转换为双倍 价值观是这样的 latitude 25 21 N longitude 55 23 E When i try to log this in android it is coming like t
  • 在log4net的appender中设置日志名称

    我有 MyLogger 类 我在其中使用 log4net 如何修改我的附加程序以将日志保存在特定的日志名中 我想通过参数 logName 设置它 public void AddEntry string source string logNa
  • Python。龙卷风。非阻塞 xmlrpc 客户端

    基本上我们可以通过以下方式调用 xmlrpc 处理程序 import xmlrpclib s xmlrpclib ServerProxy http remote host rpc print s system listmethods 在to
  • 从 XIB 文件过渡到 Storyboard

    我目前有一个使用 XIB 的 XCode 项目 并且想开始使用 Storyboard 有没有好方法将我的 XIB 文件移动到 Storyboard 中 您可以一次对一个视图控制器手动执行此操作 从 xib 复制视图 c 转到故事板并在其中创
  • 在 js.erb 文件中渲染部分内容

    我正在尝试创建一个基于 ajax 的评论表单 它将在提交时更新我的 评论列表 非常基本的东西 我有部分comments single html haml其中有一个 li 带有基本评论信息的标签 这是我的comments create js
  • 如何使用 Sequel PRO 将“设置默认值”设置为“NOW()”?

    我有一个包含一些日期的 MySQL 表 我需要其中一个的默认值等于当前时间 我正在使用 Sequel Pro 来构建数据库 然后我在默认值中写入了 now 和 GETDATE 但不起作用 有人可以帮我吗 如何使用 Sequel PRO 将
  • 有没有推荐的易于使用的 Javascript XML 库? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • libsigsegv 和响应堆栈溢出

    我们正在尝试测试学生代码 为了使该过程自动化 我们希望检测学生的代码是否溢出堆栈 我使用 libsigsegv 库及其相应的 stackoverflow install handler 取得了一些成功 它运行得非常出色 直到学生的代码两次破
  • 在 C++11 中生成随机字符串? [复制]

    这个问题在这里已经有答案了 我需要使用 C 11 生成随机字符串的帮助 我不知道如何继续 如果你能帮助我 include
  • 列表视图无限滚动

    我有一个使用自定义适配器的列表视图 现在我希望它显示前五个条目并在向下滚动时加载其他条目 最简单的方法是什么 如果我的列表代码是 public class Second extends Activity static final Strin
  • 查看 Visual Studio 中哪些方法/函数返回特定对象

    我正在 Visual Studio 中制作 C 应用程序 想知道是否有任何方法可以查看返回特定类型的每个方法 例如 我想知道哪些方法返回 AsymmetryAlgorithm 对象 Reflector http www red gate c
  • a[:] = b 和 a = b[:] 之间的区别? (Python)

    我被要求进行编码测试 但不知道答案 有人有主意吗 是切片运算符 当它位于左侧时 它会覆盖列表的内容而不创建新的引用 当它位于右侧时 它会创建具有相同内容的列表的副本
  • 如何使非英语网址在 next.js 中工作?

    如何使非英语 URL 与 next js ssr client 一起使用 欢迎任何想法 重写等 前段时间重写有助于解决这个问题 但在一些更新之后它停止工作 这是我的尝试fix this https github com zeit next
  • 从 listView 中删除标题

    我在尝试从文件中删除标头时遇到一些问题listView 起初我使用addHeaderView 添加它 但是当我更改为另一个布局时我希望它消失但是removeHeaderView 不起作用 我也尝试将可见性设置为 消失 但它并没有消失 我能做
  • RadioGroup 扩展relativelayout?

    我正在尝试为我的应用程序制作一个单选按钮网格 据我所知 使用常规方法这是不可能的RadioGroup因为它扩展了 LinearLayout 并且如果你尝试安排RadioButtons在里面使用RelativeLayoutRadioGroup
  • Prolog家族关系,意外失败

    谁能告诉我为什么我的姨妈关系不工作 每当我尝试调用它时它都会返回 false 我在下面写的叔叔关系似乎运作得很好 我不明白有什么区别 我也尝试过 not mother X Y 最后也但这并没有改变任何东西 FACTS parents dav
  • 使用泛型类型参数作为参数

    我正在尝试创建一个通用函数 它用一个函数调用另一个函数any类型参数 这是我尝试过的 static GetInstance
  • 为什么 CROSS APPLY *不*在此查询中出现无效列错误?

    我正在编写一些代码来查询一些DMV 某些列可能存在于 DMV 中 也可能不存在 具体取决于 SQL 版本 我在网上发现了一个有趣的建议 如何使用跳过特定检查CROSS APPLY 下面的查询是读取 DMV 中可能缺失的列的代码示例 该代码为