sql >> Database >  >> RDS >> Sqlserver

Is de bestelling gegarandeerd bij het invoegen van meerdere rijen met identiteit?

De zeer vergelijkbare vraag werd eerder gevraagd.

U kunt een ORDER BY . opgeven in de INSERT .

Als u dat doet, wordt de volgorde waarin de IDENTITY waarden worden gegenereerd, komen gegarandeerd overeen met de opgegeven ORDER BY in de INSERT .

Uw voorbeeld gebruiken:

DECLARE @blah TABLE
(
    ID INT IDENTITY(1, 1) NOT NULL,
    Name VARCHAR(100) NOT NULL
);

INSERT INTO @blah (Name)
SELECT T.Name
FROM
    (
        VALUES
        ('Timmy'),
        ('Jonny'),
        ('Sally')
    ) AS T(Name)
ORDER BY T.Name;

SELECT
    T.ID
    ,T.Name
FROM @blah AS T
ORDER BY T.ID;

Het resultaat is:

+----+-------+
| ID | Name  |
+----+-------+
|  1 | Jonny |
|  2 | Sally |
|  3 | Timmy |
+----+-------+

Dat wil zeggen, Name zijn gesorteerd en ID's zijn gegenereerd volgens deze volgorde. Het is gegarandeerd dat Jonny de laagste ID zal hebben, Timmy de hoogste ID en Sally zal een ID tussen hen hebben. Er kunnen hiaten zijn tussen de gegenereerde ID-waarden, maar hun relatieve volgorde is gegarandeerd.

Als u ORDER BY niet opgeeft in INSERT , dan resulterend IDENTITY ID's kunnen in een andere volgorde worden gegenereerd.

Let op, er is geen garantie voor de daadwerkelijke fysieke volgorde van rijen in de tabel, zelfs niet met ORDER BY in INSERT , de enige garantie zijn de gegenereerde ID's.

In een vraag INSERT INTO als SELECT met ORDER BY Umachandar Jayachandran van MS zei:

En hij gaf een link naar Bestellen garanties in SQL Server , waar Conor Cunningham van SQL Server Engine Team zegt:

Er is een link naar het MS Knowledge Base-artikel in de opmerkingen in dat bericht:Het gedrag van de IDENTITY-functie bij gebruik met SELECT INTO of INSERT .. SELECT-query's die een ORDER BY-clausule bevatten , waarin het in meer detail wordt uitgelegd. Er staat:

Ik zou dit KB-artikel als officiële documentatie beschouwen en dit gedrag als gegarandeerd beschouwen.



  1. Is er een PostgreSQL-equivalent van SQL Server-profiler?

  2. SQL SUM uit twee verschillende tabellen

  3. Hoe de Android-app te verbinden met de MySQL-database?

  4. Oracle-oproep opgeslagen procedure binnen select