SQL server语句的执行顺序(Order of SQL Server statements e

2019-08-01 03:26发布

我有SQL服务器2008 R2,Windows 7操作系统。

在服务器上,我有一个表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的执行顺序?

Answer 1:

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

请参阅: SQL Server不应提高不合逻辑的错误

实际上有充分的理由这样做,有时。 考虑加入两个表,其中A为A比B要小得多

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

如果检查产生的,正确或错误的查询计划,SQL Server将流中根据数据为龙头的行加入反对B.虽然这样做,它知道只需要拉col2function on col1 。 它可能会带来col1通过只是在以后运行的功能,或用于微不足道CAST东西,SQL Server可能会以及在流动过程转换数据。

有一两件事是肯定的,这种策略确实让SQL Server的一个更快一点在某些查询。 但在纯逻辑的角度来看,我会说它是一个错误。



Answer 2:

我无法解释的行为,但下面会得到你想要的东西:

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

我不知道为什么最后where子句导致,因为它看起来对我来说,它应该已经被过滤掉的结果集T1的待执行的转换。



文章来源: Order of SQL Server statements execution