Stai facendo l'errore comune di assumere un ordine nella tabella. I tavoli non hanno ordine. Solo i risultati hanno un ordine, che è indeterminato a meno che non sia specificato un ORDER BY esplicito.
Potresti porre una domanda diversa:come viene assegnato il valore generato dall'identità in caso di inserimenti simultanei? La risposta è semplice:non importa . E se fai supposizioni sull'ordine, il tuo codice è rotto. Lo stesso vale per le lacune. La tua applicazione dovrebbe funzionare anche se le identità generate sono completamente casuali e l'applicazione scritta correttamente funzionerà funziona se l'identità è completamente casuale. Usa SCOPE_IDENTITY()
per recuperare l'ultima identità inserita. Meglio ancora, usa OUTPUT
clausola di INSERT
, funziona anche con inserti multiriga.
Per la cronaca:le identità vengono generate nell'ordine in cui le operazioni acquisiscono l'accesso a flusso di registro .