在阅读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中物理存储(“物化”)并从那里使用 用户的其余部分,而不是从基地查询回来 表。
答案 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子句,优化器可以将查询重写为与您的第一个查询相同。