Questo è ancora un problema molto comune tra molti sviluppatori e applicazioni indipendentemente dalle dimensioni.
Sfortunatamente i suggerimenti di cui sopra non risolvono tutti gli scenari, ad esempio hosting condiviso, non puoi fare affidamento sul tuo host per impostare il parametro di avvio -t272.
Inoltre, se disponi di tabelle esistenti che utilizzano queste colonne di identità per le chiavi primarie, è uno sforzo ENORME eliminare quelle colonne e ricrearne di nuove per utilizzare la soluzione alternativa alla sequenza BS. La soluzione alternativa per la sequenza è utile solo se si progettano nuove tabelle da zero in SQL 2012+
La linea di fondo è che, se sei su Sql Server 2008R2, RIMANI SU DI ESSO. Seriamente, rimani su. Fino a quando Microsoft non ammetterà di aver introdotto un bug ENORME, che è ancora presente anche in Sql Server 2016, non dovremmo eseguire l'aggiornamento fino a quando non lo possiedono e FIX IT.
Microsoft ha introdotto una modifica sostanziale, ovvero ha rotto un'API funzionante che non funziona più come progettato, a causa del fatto che il loro sistema dimentica la loro identità attuale al riavvio. Cache o nessuna cache, questo è inaccettabile e lo sviluppatore Microsoft con il nome di Bryan deve possederlo, invece di dire al mondo che è "by design" e una "funzionalità". Certo, il caching è una caratteristica, ma perdere traccia di quale dovrebbe essere la prossima identità, NON È UNA CARATTERISTICA. È un BUG impazzito !!!
Condividerò la soluzione alternativa che ho usato, perché i miei DB sono su server di hosting condiviso, inoltre, non sto rilasciando e ricreando le mie colonne chiave primaria, sarebbe un enorme PITA.
Invece, questo è il mio vergognoso trucco (ma non così vergognoso come questo bug POS introdotto da Microsoft).
Hack / Fix:
Prima dei comandi di inserimento, è sufficiente eseguire il seeding della propria identità prima di ogni inserimento. Questa correzione è consigliata solo se non si dispone del controllo amministrativo sull'istanza di Sql Server, altrimenti suggerisco di eseguire il reseeding al riavvio del server.
declare @newId int -- where int is the datatype of your PKey or Id column
select @newId = max(YourBuggedIdColumn) from YOUR_TABLE_NAME
DBCC CheckIdent('YOUR_TABLE_NAME', RESEED, @newId)
Solo quelle 3 righe immediatamente prima del tuo inserto, e dovresti essere a posto. Non influirà molto sulle prestazioni, ovvero sarà impercettibile.
In bocca al lupo.
order by ReceiptNo
alla tua query, quei record non sono davvero lì? Sei sicuro che quando vengono inseriti i record non ci siano errori? Se un record tenta di essere inserito e fallisce, l'identità aumenterà, stessa cosa se i record vengono eliminati. Se i record vengono eliminati, il fileReceiptNo
non viene ripristinato. Puoi pubblicare la tabella di creazione per laFee
tabella?