Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server和中间物化?_Sql Server_Sql Server 2008_Where Clause - Fatal编程技术网

Sql server SQL Server和中间物化?

Sql server SQL Server和中间物化?,sql-server,sql-server-2008,where-clause,Sql Server,Sql Server 2008,Where Clause,在阅读了关于中间物化的内容之后,我仍然有一些问题 我有一个疑问: SELECT * FROM ... WHERE isnumeric(MyCol)=1 and ( CAST( MyCol AS int)>1) 然而,where子句的顺序是不确定的 所以我可能会有例外。如果他第一次试着投K1 我想这会解决问题 SELECT MyCol FROM (SELECT TOP 100 PERCENT foo From MyTable WHERE ISNUMERIC

在阅读了关于中间物化的内容之后,我仍然有一些问题

我有一个疑问:

SELECT    *
FROM  ...
WHERE       isnumeric(MyCol)=1  and ( CAST( MyCol AS int)>1) 
然而,where子句的顺序是不确定的

所以我可能会有例外。如果他第一次试着投K1

我想这会解决问题

SELECT MyCol 
FROM
    (SELECT TOP 100 PERCENT foo From MyTable WHERE ISNUMERIC (MyCol ) > 1 ORDER BY MyCol ) bar
WHERE
    CAST(MyCol AS int) > 100
为什么与我的常规查询相比,排名前100+的订单会发生变化? 我在评论中读到:

中间结果——换言之,在测试过程中获得的结果 用于计算最终结果的过程将是 物理存储在TempDB中,并从中用于 用户的其余部分,而不是从基础查询回来 桌子

如果它存储在tempDB中或从基表查询回来,会有什么区别?这是相同的数据!
通过将TOP子句添加到内部查询中,可以强制SQL Server在运行外部查询之前先运行该查询,从而丢弃ISNUMERIC返回false的所有行


如果没有TOP子句,optimizer可以将查询重写为与第一个查询相同。

受支持的避免由于optimizer重新组织内容而导致错误的方法是使用:

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

前100%通常在SQL Server 2005以后

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