当前位置: 首页 > 面试题库 >

SQL Server语句执行的顺序

白星海
2023-03-14
问题内容

我有SQL Server 2008 R2,Windows 7 OS。

在服务器内,我有一个con1通过以下SQL语句创建的表。

CREATE TABLE [dbo].[con1](
    [digit_str] [nvarchar](50) NULL
) ON [PRIMARY]

con1表中,我具有以下值:

 digit_str
----------------
    1
    1
    2
    3
    4
    5
    1.

我确实对数据库执行了以下SQL语句:

SELECT t1.digit FROM
(
select CAST(digit_str as int) as digit from con1 where RIGHT(digit_str,1) <> '.'
) as t1
where t1.digit <> 1

服务器给我以下错误消息

转换nvarchar值“ 1”时转换失败。 数据类型为int。

我以为我的内部SQL首先执行并创建了一个临时表t1,因此1.它不包含在表中t1,然后SQL解析器将用于where t1.digit <> 1过滤临时表t1

但是以上似乎不对,所以有人能解释以上SQL的执行顺序吗?


问题答案:

这是SQL Server的已知“功能”。永远不要假设WHERE子句在SELECT子句之前执行。

请参阅:SQL
Server不应引发不合逻辑的错误

有时确实有充分的理由这样做。考虑联接两个表,其中A比B小得多。

select CAST(A.col1 as int), A.col2, B.col3
from A join B ...
where ... isnumeric(A.col1) = 1

如果检查是对还是错,生成的查询计划是正确的还是错误的,SQL
Server会将来自A的数据流作为要与B联接的前导行。在这样做的同时,它知道只需要拉col2和即可 function on col1。它可能col1只是为了稍后运行该函数,或者对于像CAST这样琐碎的事情,SQL Server可能还会在流处理过程中转换数据。

可以肯定的是,这种策略确实使SQL Server在某些查询中快了一点。但是从纯粹的逻辑角度来看,我将其称为错误。



 类似资料:
  • 我在研究手机导航。我对简单的if/else如何工作的理解肯定有根本性的错误(我已经有一段时间没有使用jQ/js了),因为这两个语句是串行执行的。实际上‘else’首先运行,然后——不管我是否包含‘toggleNav()’函数或$(nav)。toggleClass('open') -然后也执行' if '语句。 我认为这可能与事件有关,所以我尝试了两个li上的函数。仪表板切换导航和(a.dashbo

  • 问题内容: 这个问题与执行顺序无关。这只是关于ORDER BY。 在标准执行中是: FROM WHERE GROUP BY HAVING SELECT ORDER BY TOP 编辑:这个问题或多或少是“ 执行ORDER BY表达式时SQL Server是否应用短路评估吗? ”的答案是有时!我只是还没有找到一个合理的理由。参见编辑#4。 现在假设我有一个这样的声明: 这不是我要执行的真实语句,而只

  • 本文向大家介绍数据库中的SELECT语句逻辑执行顺序分析,包括了数据库中的SELECT语句逻辑执行顺序分析的使用技巧和注意事项,需要的朋友参考一下 引言   这不是一个什么多深的技术问题,多么牛叉的编程能力。这跟一个人的开发能力也没有非常必然的直接关系,但是知道这些会对你的SQL编写,排忧及优化上会有很大的帮助。它不是一个复杂的知识点,但是一个非常基础的SQL根基。不了解这些,你一直用普通水泥盖房

  • 问题内容: 在MySQL中执行子句的预定义顺序是什么?它是否在运行时确定,并且此顺序正确吗? 问题答案: MySQL语句的实际执行有些棘手。但是,该标准确实指定了查询中元素解释的顺序。这基本上是在您指定的顺序,但我想和能来后: 条款 条款 条款 条款 条款 条款 这对于了解如何解析查询很重要。例如,您不能使用在子句中的定义的列别名,因为会在之前解析。另一方面,这样的别名可以在子句中。 至于实际执行

  • 问题内容: 我在Hibernate尝试了简单的程序,并发现了一堆异常。 我不知道到底是什么问题。 我有三个课程-书籍,阅读器和使用。最后一个是将前两个绑定为一对多。 这是我的: 这是异常消息: 的摘要: DB上的所有表均已创建,但为空。一切都还好。有什么建议么? 如何解决这个麻烦? 问题答案: 在MySQL中, USING 是保留字。 因此,只需使用实体上的注释来重命名表即可。就像是 我假设您有一

  • 我得到以下错误,当我尝试添加一个应用程序和应用程序设置。以下是详细的错误消息: 下面是junit测试 这是保存应用程序和设置的方法 这些是DAO类。 这是应用刀 为什么我会得到上面的错误?如果你们需要更多的信息,请告诉我。 更新