sql >> Database >  >> RDS >> Sqlserver

SELECT * INTO behoudt ORDER BY in SQL Server 2008 maar niet 2012

Hoe kun je zien wat de bestelling in een tafel is door select * from #result te gebruiken? ? Er is geen garantie met betrekking tot de bestelling in een select vraag.

De resultaten zijn echter anders op SQL Fiddle. Als je wilt garanderen dat de resultaten hetzelfde zijn, voeg dan een primaire sleutel toe. Dan is de plaatsingsvolgorde gegarandeerd:

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;

Ik verafschuw nog steeds het doen van select * from Result na dit. Maar ja, het geeft ze wel in de juiste volgorde terug in zowel SQL Server 2008 als 2012. Niet alleen dat, maar omdat SQL Server garandeert dat primaire sleutels in de juiste volgorde worden ingevoegd, zijn de records zelfs gegarandeerd in de juiste volgorde in dit geval.

MAAR . . . alleen omdat de records in een bepaalde volgorde op de pagina's staan, betekent niet dat ze in die volgorde worden opgehaald zonder order by clausule.



  1. PostgreSQL array_agg(INTEGER[])

  2. Een Java-toepassing maken in Oracle JDeveloper, deel 2

  3. voeg twee tabellen samen zonder relevante waarden te verliezen

  4. Fout 2006:MySQL-server is verdwenen met Python, Bottle Microframework en Apache