Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

SELECT * INTO retém ORDER BY no SQL Server 2008, mas não no 2012


Como você pode saber qual é o pedido dentro de uma tabela usando select * from #result ? Não há garantia quanto ao pedido em um select consulta.

No entanto, os resultados são diferentes no SQL Fiddle. Se você quiser garantir que os resultados sejam os mesmos, adicione uma chave primária. Então o pedido de inserção é garantido:
CREATE TABLE MyTable(Name VARCHAR(50), SortOrder INT)
INSERT INTO MyTable 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 result from MyTable;

alter table Result add id int identity(1, 1) primary key;

insert into Result(name, sortorder)
    SELECT * FROM MyTable
    ORDER BY SortOrder;

Eu ainda detesto fazer select * from Result depois disto. Mas sim, ele os retorna na ordem correta no SQL Server 2008 e 2012. Não apenas isso, mas como o SQL Server garante que as chaves primárias sejam inseridas na ordem correta, os registros são garantidos até mesmo na ordem correta em este caso.

MAS . . . só porque os registros estão em uma ordem específica nas páginas não significa que eles serão recuperados nessa ordem sem order by cláusula.