我有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类。 这是应用刀 为什么我会得到上面的错误?如果你们需要更多的信息,请告诉我。 更新