Dies ist immer noch ein sehr häufiges Problem bei vielen Entwicklern und Anwendungen, unabhängig von ihrer Größe.
Leider beheben die obigen Vorschläge nicht alle Szenarien, dh Shared Hosting. Sie können sich nicht darauf verlassen, dass Ihr Host den Startparameter -t272 festlegt.
Wenn Sie über vorhandene Tabellen verfügen, die diese Identitätsspalten für Primärschlüssel verwenden, ist es ein RIESIGER Aufwand, diese Spalten zu löschen und neue zu erstellen, um die BS-Sequenzumgehung zu verwenden. Die Sequenzumgehung ist nur dann gut, wenn Sie die Tabellen in SQL 2012+ von Grund auf neu entwerfen
Fazit: Wenn Sie sich auf SQL Server 2008R2 befinden, bleiben Sie auf IT. Im Ernst, bleib dran. Bis Microsoft zugibt, dass sie einen RIESIGEN Fehler eingeführt haben, der auch in SQL Server 2016 noch vorhanden ist, sollten wir erst dann ein Upgrade durchführen, wenn sie ihn besitzen und die IT reparieren.
Microsoft hat sofort eine grundlegende Änderung eingeführt, dh, sie haben eine funktionierende API beschädigt, die nicht mehr wie geplant funktioniert, da ihr System bei einem Neustart ihre aktuelle Identität vergisst. Cache oder kein Cache, dies ist inakzeptabel, und der Microsoft-Entwickler namens Bryan muss ihn besitzen, anstatt der Welt mitzuteilen, dass er "beabsichtigt" und eine "Funktion" ist. Sicher, das Caching ist eine Funktion, aber den Überblick über die nächste Identität zu verlieren, ist keine Funktion. Es ist ein verdammter Käfer !!!
Ich werde die von mir verwendete Problemumgehung freigeben, da sich meine Datenbanken auf Shared Hosting-Servern befinden. Außerdem lösche ich meine Primärschlüsselspalten nicht und erstelle sie neu. Dies wäre eine riesige PITA.
Stattdessen ist dies mein beschämender Hack (aber nicht so beschämend wie dieser POS-Fehler, den Microsoft eingeführt hat).
Hack / Fix:
Setzen Sie vor Ihren Einfügebefehlen vor jeder Einfügung Ihre Identität neu ein. Dieser Fix wird nur empfohlen, wenn Sie keine Administratorsteuerung über Ihre SQL Server-Instanz haben. Andernfalls empfehle ich, beim Neustart des Servers erneut zu säen.
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)
Nur diese 3 Zeilen unmittelbar vor dem Einfügen, und Sie sollten bereit sein zu gehen. Es wird die Leistung wirklich nicht so stark beeinträchtigen, dh es wird nicht bemerkt.
Viel Glück.
order by ReceiptNo
Ihrer Abfrage hinzufügen , sind diese Datensätze wirklich nicht vorhanden? Sind Sie sicher, dass beim Einfügen von Datensätzen keine Fehler vorliegen? Wenn ein Datensatz versucht, eingefügt zu werden, und dies fehlschlägt, wird die Identität erhöht. Dies gilt auch, wenn Datensätze gelöscht werden. Wenn Datensätze gelöscht werden, wird derReceiptNo
nicht zurückgesetzt. Können Sie die Erstellungs-Tabelle für dieFee
Tabelle veröffentlichen?