我知道在SQL Server 2005之前,您可以“欺骗” SQL Server,以允许在视图定义中使用订单,也可以TOP 100 PERCENT在SELECT子句中包含该订单。但是我看到了我继承的其他代码,这些代码SELECT TOP 100 PERCENT在动态SQL语句(在ASP.NET应用程序的ADO中 使用)中使用了...。有什么理由吗?结果与不包括一样吗?TOP 100 PERCENT
我知道在SQL Server 2005之前,您可以“欺骗” SQL Server,以允许在视图定义中使用订单,也可以TOP 100 PERCENT在SELECT子句中包含该订单。但是我看到了我继承的其他代码,这些代码SELECT TOP 100 PERCENT在动态SQL语句(在ASP.NET应用程序的ADO中 使用)中使用了...。有什么理由吗?结果与不包括一样吗?TOP 100 PERCENT
Answers:
它用于“中间实现(Google搜索) ”
他甚至提出了MS Connect,因此可以以更清洁的方式完成
我的观点“并非天生不好”,但除非100%确信,否则不要使用它。问题是,它仅在您执行操作时才起作用,并且可能以后不会起作用(补丁程序级别,架构,索引,行数等)...
这可能会失败,因为您不知道事物的评估顺序
SELECT foo From MyTable WHERE ISNUMERIC (foo) = 1 AND CAST(foo AS int) > 100
而且这也可能失败,因为
SELECT foo
FROM
(SELECT foo From MyTable WHERE ISNUMERIC (foo) = 1) bar
WHERE
CAST(foo AS int) > 100
但是,这在SQL Server 2000中没有。内部查询被评估并假脱机:
SELECT foo
FROM
(SELECT TOP 100 PERCENT foo From MyTable WHERE ISNUMERIC (foo) = 1 ORDER BY foo) bar
WHERE
CAST(foo AS int) > 100
请注意,这在SQL Server 2005中仍然有效
SELECT TOP 2000000000 ... ORDER BY...
TOP(100)PERCENT在SQL Server的最新版本中完全没有意义,并且它(以及相应的ORDER BY,在视图定义或派生表的情况下)将被查询处理器忽略。
您是对的,曾经有一段时间,它可以用作技巧,但即使如此,它也不可靠。可悲的是,Microsoft的某些图形工具加入了这个毫无意义的条款。
至于为什么它可能会出现在动态SQL中,我不知道。您是正确的,没有理由,没有它的结果是相同的(同样,对于视图定义或派生表,没有TOP和ORDER BY子句)。
TOP (100) PERCENT:“ ...我可能会尝试通过将TOP 100 PERCENT与ORDER BY结合使用来强制派生表的中间实现(没有临时表)。不幸的是,SQL Server查询优化器团队认为这不是。并不是一个好主意,优化器现在忽略了这种尝试。” 它实际上支持您。
...允许在视图定义中使用ORDER BY。
那不是一个好主意。视图绝对不应定义ORDER BY。
ORDER BY对性能有影响-使用它的视图意味着ORDER BY将出现在解释计划中。如果您有一个查询,该查询将视图与即时查询中的任何内容连接在一起,或在嵌入式视图中引用(CTE /子查询分解),则ORDER BY始终在最终的ORDER BY之前运行(假定已定义)。当查询未使用TOP(对于MySQL / Postgres为LIMIT)时,对不是最终结果集的行进行排序没有任何好处。
考虑:
CREATE VIEW my_view AS
SELECT i.item_id,
i.item_description,
it.item_type_description
FROM ITEMS i
JOIN ITEM_TYPES it ON it.item_type_id = i.item_type_id
ORDER BY i.item_description
...
SELECT t.item_id,
t.item_description,
t.item_type_description
FROM my_view t
ORDER BY t.item_type_description
...相当于使用:
SELECT t.item_id,
t.item_description,
t.item_type_description
FROM (SELECT i.item_id,
i.item_description,
it.item_type_description
FROM ITEMS i
JOIN ITEM_TYPES it ON it.item_type_id = i.item_type_id
ORDER BY i.item_description) t
ORDER BY t.item_type_description
这很不好,因为:
ORDER BY item_type_description, item_description请尝试以下,希望它对您有用。
SELECT TOP
( SELECT COUNT(foo)
From MyTable
WHERE ISNUMERIC (foo) = 1) *
FROM bar WITH(NOLOCK)
ORDER BY foo
WHERE CAST(foo AS int) > 100
)
错误说明了一切...
消息1033,级别15,状态1,过程TestView,第5行除非还指定了TOP,OFFSET或FOR XML,否则ORDER BY子句在视图,内联函数,派生表,子查询和公用表表达式中无效。
不要使用TOP 100 PERCENT,请使用TOP n,其中N是数字
SQL Server VIEW(2012年后的版本)忽略了TOP 100 PERCENT(出于我不知道的原因),但我认为MS出于语法原因保留了它。TOP n更好,可以在视图内部工作,并在最初使用视图时以所需的方式对其进行排序,但要小心。
我想您可以在结果中使用变量,但是除了在视图中获得ORDER BY片段外,通过隐式声明“ TOP 100 PERCENT”不会带来任何好处:
declare @t int
set @t=100
select top (@t) percent * from tableOf
Why use Select Top 100 Percent不是要获取百分比的可变计数。