SQL Server和中间实现?

时间:2012-10-17 14:46:34

标签: sql-server sql-server-2008 where-clause

在阅读this interesting article关于中间实现后 - 我仍然有一些问题。

我有这个问题:

SELECT    *
FROM  ...
WHERE       isnumeric(MyCol)=1  and ( CAST( MyCol AS int)>1) 

但是,where子句的顺序是不是确定性。

所以我可能在这里获得异常。(如果他第一次尝试投射"k1k1"

我认为这样可以解决问题

SELECT MyCol 
FROM
    (SELECT TOP 100 PERCENT foo From MyTable WHERE ISNUMERIC (MyCol ) > 1 ORDER BY MyCol ) bar
WHERE
    CAST(MyCol AS int) > 100
  • 为什么将top 100 + order改为VS我的常规查询?

我在评论中读到:

  

(“中间”结果 - 换句话说,在...期间获得的结果   将用于计算最终结果的过程   在TempDB中物理存储(“物化”)并从那里使用   用户的其余部分,而不是从基地查询回来   表。

  • 如果它存储在tempDB中或从基表中查询回来会有什么不同?它是相同的数据

2 个答案:

答案 0 :(得分:4)

避免因优化程序重新组织而导致错误的支持方法是使用CASE

SELECT *
FROM YourTable
WHERE
    1 <=
    CASE
        WHEN aa NOT LIKE '%[^0-9]%'
        THEN CONVERT(int, aa)
        ELSE 0
    END;

中间实现不是一种受支持的技术,因此只有在理解和接受风险的特殊情况下才能由非常专业的用户使用。

TOP 100 PERCENT在SQL Server 2005之后通常为ignored by the optimizer

答案 1 :(得分:1)

通过将TOP子句添加到内部查询中,您迫使SQL Server在运行外部查询之前首先运行该查询 - 从而丢弃ISNUMERIC返回false的所有行。

如果没有TOP子句,优化器可以将查询重写为与您的第一个查询相同。