sql >> Base de Datos >  >> RDS >> Sqlserver

¿Se garantiza el orden al insertar varias filas con identidad?

El muy similar pregunta fue preguntado antes.

Puede especificar un ORDER BY en el INSERT .

Si lo hace, el orden en que la IDENTITY Se garantiza que los valores generados coincidan con el ORDER BY especificado en el INSERT .

Usando tu ejemplo:

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;

El resultado es:

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

Es decir, Name se han ordenado y los ID se han generado de acuerdo con este orden. Se garantiza que Jonny tendrá la identificación más baja, Timmy tendrá la identificación más alta y Sally tendrá la identificación entre ellos. Puede haber espacios entre los valores de ID generados, pero su orden relativo está garantizado.

Si no especifica ORDER BY en INSERT , entonces resultando IDENTITY Los ID se pueden generar en un orden diferente.

Eso sí, no hay garantía para el orden físico real de las filas en la tabla, incluso con ORDER BY en INSERT , la única garantía son los ID generados.

En una pregunta INSERTAR EN como SELECCIONAR con ORDEN POR Umachandar Jayachandran de MS dijo:

Y dio un enlace a Ordering garantías en SQL Server , donde Conor Cunningham de SQL Server Engine Team dice:

Hay un enlace al artículo de la base de conocimientos de MS en los comentarios de esa publicación:El comportamiento de la función IDENTITY cuando se usa con SELECT INTO o INSERT .. Consultas SELECT que contienen una cláusula ORDER BY , que lo explica con más detalles. Dice:

Consideraría este artículo de KB como una documentación oficial y consideraría este comportamiento garantizado.