Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

SELECT * INTO conserve ORDER BY dans SQL Server 2008 mais pas 2012

Comment savoir quelle est la commande dans un tableau en utilisant select * from #result ? Il n'y a aucune garantie quant à la commande dans un select requête.

Cependant, les résultats sont différents sur SQL Fiddle. Si vous voulez garantir que les résultats sont identiques, ajoutez une clé primaire. L'ordre d'insertion est alors garanti :

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;

J'ai toujours horreur de faire select * from Result après ça. Mais oui, il les renvoie dans le bon ordre dans SQL Server 2008 et 2012. Non seulement cela, mais comme SQL Server garantit que les clés primaires sont insérées dans le bon ordre, les enregistrements sont même garantis dans le bon ordre dans cette affaire.

MAIS . . . ce n'est pas parce que les enregistrements sont dans un ordre particulier sur les pages qu'ils seront récupérés dans cet ordre sans order by clause.