为什么这个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
答案 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的不同版本中有所不同。