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

时间:2015-04-29 10:10:03

标签: sql-server-2008-r2 sql-server-2012

为什么这个SQL查询在SQL 2008R2和2012中产生不同的输出结果。看起来这个查询的2008R2结果看起来很好。为什么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

2 个答案:

答案 0 :(得分:0)

我们无法通过使用#ResultTable中的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中以正确的顺序返回它们。

由于SQL Server保证以正确的顺序插入主键,因此在这种情况下,保证记录的顺序也正确。

如果您在任何情况下遇到任何特定问题,请告知我们,以便我们尝试解决相同问题。

谢谢。

答案 1 :(得分:0)

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

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

  

指定ORDER BY子句不保证按指定的顺序插入行。

然后SELECT来自临时表的所有行都没有ORDER BY子句,这也没有保证您将接收行的顺序。您将采用与行相同的顺序插入了,但无法确定该命令是什么。

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