Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Czy zamówienie jest gwarantowane podczas wstawiania wielu wierszy z tożsamością?

Bardzo podobny pytanie został wcześniej zapytany.

Możesz określić ORDER BY w INSERT .

Jeśli to zrobisz, kolejność, w jakiej IDENTITY wartości są generowane na pewno pasują do określonego ORDER BY w INSERT .

Na twoim przykładzie:

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;

Wynik:

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

To znaczy Name zostały posortowane i identyfikatory zostały wygenerowane zgodnie z tą kolejnością. Gwarantujemy, że Jonny będzie miał najniższy identyfikator, Timmy najwyższy, Sally będzie miał identyfikator między nimi. Mogą występować luki między wygenerowanymi wartościami identyfikatorów, ale ich względna kolejność jest gwarantowana.

Jeśli nie określisz ORDER BY w INSERT , a następnie wynikowa IDENTITY Identyfikatory mogą być generowane w innej kolejności.

Pamiętaj, że nie ma gwarancji rzeczywistej fizycznej kolejności wierszy w tabeli, nawet w przypadku ORDER BY w INSERT , jedyną gwarancją są wygenerowane identyfikatory.

W pytaniu INSERT INTO jako SELECT z ORDER BY Umachandar Jayachandran z MS powiedział:

I podał link do Zamawianie gwarancje w SQL Server , gdzie Conor Cunningham z zespołu SQL Server Engine mówi:

W komentarzach w tym poście znajduje się link do artykułu z bazy wiedzy MS:Zachowanie funkcja IDENTITY w przypadku użycia z zapytaniami SELECT INTO lub INSERT .. SELECT zawierającymi klauzulę ORDER BY , co wyjaśnia to bardziej szczegółowo. Mówi:

Uważam ten artykuł KB za oficjalną dokumentację i uważam to zachowanie za gwarantowane.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak zaplanować codzienne uruchamianie zapytania SQL?

  2. SQL — pobierz podciąg po pierwszej i drugiej spacji w osobnych kolumnach

  3. Implementacja wyszukiwania pełnotekstowego w SQL Server 2016 dla początkujących

  4. SYSDATETIMEOFFSET() Przykłady w SQL Server (T-SQL)

  5. Wskazówki, jak zmniejszyć złożoność SQL Server