【问题标题】:TSQL verify sort order / UNION ALLTSQL 验证排序顺序 / UNION ALL
【发布时间】: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
  1. 我们能否保证存储过程按给定顺序返回结果?

  2. 通常情况下,当我们将这些选择查询插入临时表时,我们无法保证其插入顺序。所以我们必须使用 order by 子句。但大多数时候它给出相同的顺序。我们可以强制给它一些不同的命令吗?这与聚集和非聚集索引有关吗?

  3. 在第二种情况下,我们可以通过添加标识列来强制插入顺序吗?

【问题讨论】:

  • 保证订单? 当然!只需在您的最终输出中添加一个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


【解决方案1】:

当您插入数据时,SQL 将其称为一个集合。甚至在将数据写入磁盘时,它也会尝试占用最少的空间并开始在空闲页面中插入行,它首先在非均匀范围中找到。因此,当您查询数据时,结果取决于现金中信息的顺序和从硬盘中读取信息的顺序。我认为几乎不可能预测这些订单,因为它取决于操作系统、其他程序等的工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-29
    • 1970-01-01
    • 2021-10-10
    • 1970-01-01
    • 2019-05-24
    • 1970-01-01
    • 1970-01-01
    • 2011-06-14
    相关资源
    最近更新 更多