我知道在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
不是要获取百分比的可变计数。