SQL同一个查询输出不同的结果集

SQL Different output result set for same query

为什么此 SQL 查询在 SQL 2008R2 中产生不同的输出结果,而 2012.It 似乎此查询的 2008R2 结果看起来 fine.Why 2012 年缺少相同的排序顺序?

Declare @TempTable TABLE (Name VARCHAR(25), RankOrder INT)
INSERT INTO @TempTable SELECT 'b', 2 UNION ALL SELECT 'd', 4 UNION ALL SELECT  'a', 1 UNION ALL SELECT 'e', 5 UNION ALL SELECT 'c', 3
SELECT * INTO #ResultTable FROM @TempTable ORDER BY RankOrder
SELECT * FROM #ResultTable
DROP TABLE #ResultTable

我们无法通过使用来自#ResultTable 的select * 来判断table 中的顺序是什么?无法保证 select 查询中的顺序。

但是,在大多数情况下,SQL Fiddle 上的结果集是不同的。如果要保证结果集应该相同,那就加一个主键。然后插入顺序将保持不变:

    DECLARE @TempTable TABLE (Name VARCHAR(50), SortOrder INT)
    INSERT INTO @TempTable SELECT 'b', 2 UNION ALL SELECT 'c', 3 UNION ALL SELECT 'a', 1 UNION ALL SELECT 'e', 5 UNION ALL SELECT 'd', 4


    SELECT TOP 0 * into #ResultTable from @TempTable;

    ALTER TABLE #ResultTable add id int identity(1, 1) primary key;

    INSERT INTO #ResultTable(name, sortorder)
        SELECT * FROM @TempTable
        ORDER BY SortOrder;

    SELECT * FROM #ResultTable
    DROP TABLE #ResultTable

但在此之后我仍然会忽略从#ResultTable 执行select *。但是,是的,它在 SQL Server 2008 和 2012 中都以正确的顺序 return 它们。

因为SQL服务器保证主键以正确的顺序插入,在这种情况下也保证记录的顺序正确。

如果您在任何情况下遇到任何具体问题,请告诉我们,我们会尽力解决。

谢谢。

使用 SELECT ... INTO <new_table> ... 语句几乎忽略了 ORDER BY 语句。

来自 INTO clause 文档,限制和限制:

Specifying an ORDER BY clause does not guarantee the rows are inserted in the specified order.

你然后 SELECT 来自临时 table 的所有行没有 ORDER BY 子句,这也不能保证你将以什么顺序接收这些行。你会假设与插入行的顺序相同,但也不能保证该顺序是什么。

总而言之,您不能期望返回行的任何特定顺序,它们在同一 RDBMS 的不同版本中可能会有所不同。