【发布时间】:2014-10-07 16:01:02
【问题描述】:
CREATE PROCEDURE Test
AS
BEGIN
SELECT * FROM (
SELECT 1 AS a,'test1' as b, 'query1' as c
UNION ALL
SELECT 2 AS a,'test22' as b, 'query22' as c
UNION ALL
SELECT 2 AS a,'test2' as b, 'query2' as c
UNION ALL
SELECT 3 AS a,'test3' as b, 'query3' as c
UNION ALL
SELECT 4 AS a,'test4' as b, 'query4' as c
) As sample
FOR XML RAW
END
我们能否保证存储过程按给定顺序返回结果?
通常情况下,当我们将这些选择查询插入临时表时,我们无法保证其插入顺序。所以我们必须使用 order by 子句。但大多数时候它给出相同的顺序。我们可以强制给它一些不同的命令吗?这与聚集和非聚集索引有关吗?
在第二种情况下,我们可以通过添加标识列来强制插入顺序吗?
【问题讨论】:
-
保证订单? 当然!只需在您的最终输出中添加一个
ORDER BY子句...。在任何RDBMS 中,您确实不有任何订购保证除非 您明确指定了ORDER BY。它可能看起来像它按集群键或其他东西的顺序返回 - 但没有没有保证。如果您需要订购 - 请使用ORDER BY。完成。 -
不,我只需要检查它是否在没有 ORDER BY 子句的情况下工作,因为此查询不会将数据插入临时表。
-
在
INSERT- 没有订购。数据刚刚插入。在SELECT,如果您需要订购 - 使用ORDER BY- 就这么简单。 -
你能解释一下为什么我们需要 ORDER BY 的背后逻辑吗?对我来说,这表明存储过程给出了相同的输出。有没有办法强制退回另一个订单。我正在检查是否需要检查旧存储过程中的排序顺序。
-
请参阅 Aaron Bertrand 的 Bad habits to kick - relying on undocumented behavior - 在文章的中间,他有一个关于“没有 ORDER BY 的订购”的部分 - 阅读并接受它!
标签: sql-server-2008 tsql temp-tables union-all