2010-12-05 5 views
5

Ich habe Spalte in meiner Tabelle, sagen updateStamp. Ich möchte einen Ansatz erhalten, um dieses Feld mit einer neuen fortlaufenden Nummer nach Zeilenaktualisierung zu aktualisieren.SQL Server - Wie generiere ich eine eindeutige fortlaufende Nummer beim Update

Die Datenbank hat viel Verkehr, meist gelesen, aber mehrere gleichzeitige Aktualisierungen können auch in Stapeln passieren. Daher sollte die Lösung minimale Sperren verursachen.

Grund für diese Anforderung ist, dass ich eine Lösung für Clients haben muss, um über die Tabelle vorwärts zu iterieren und wenn eine Zeile aktualisiert wird - sollte es wieder in der Ergebnismenge kommen.

So Abfrage wäre dann wie

SELECT * 
FROM mytable 
WHERE updateStamp > @lastReturnedUpdateStamp 
ORDER BY updateStamp 

Leider nicht Zeitstempel hier arbeiten, weil mehrere Updates zur gleichen Zeit passieren könnten.

+0

Was Version von SQL Server sind Sie eingeschaltet? Wenn SQL Server 2008, denke ich, "Change Tracking" tut, was Sie brauchen, und löst subtile Probleme mit "Zeitstempel" und Transaktions-Commit-Zeiten. –

+0

2008 R2 benutze ich. Danke für den Vorschlag! Ich war mir dieser Eigenschaft nicht bewusst. Obwohl dies ein Overkill für meine Anforderungen ist. – user431529

Antwort

2

Der timestamp (nicht mehr weiterentwickelt) oder rowversion (aktuelle) -Datentyp ist der einzige mir bekannte, der bei jedem Schreibvorgang in der Zeile aktualisiert wird.

Es ist kein Zeitstempel per se - es speichert kein Datum, Uhrzeit in Stunden, Sekunden usw. - es ist wirklich mehr von RowVersion (daher die Namensänderung) - eine einzigartige, ständig wachsende Zahl (binär) in der Reihe.

Es wird normalerweise verwendet, um nach Änderungen zwischen der Zeit, in der Sie die Zeile gelesen haben, und der Zeit, zu der Sie die Zeile aktualisieren, zu prüfen.

Da es sich nicht wirklich um eine Datums-/Zeitinformation handelt, müssen Sie höchstwahrscheinlich eine andere Spalte für diese lesbaren Informationen haben. Sie können Ihrer Tabelle eine LastModified DATETIME-Spalte hinzufügen, und mit einer DEFAULT GETDATE()-Einschränkung können Sie beim Einfügen einen neuen Wert einfügen. Um dies auf dem neuesten Stand zu halten, müssen Sie einen AFTER UPDATE-Trigger schreiben, um die Spalte LastModified zu aktualisieren, wenn eine Aktualisierung stattfindet.

SQL Server 2011 (auch bekannt als „Denali“) wird uns SEQUENCES bringen, die die perfekte Passform in Ihrem Fall wären hier - aber ach, das ist noch mindestens ein Jahr von offiziellen Release .....

+0

Das passt perfekt zu meinem Fall. Getestet und es funktioniert gut! Seltsame Sache, SQL Server Management Studio bietet jedoch keinen Rowversion-Datentyp in der Vorschlags-Box. Also, benutze Timestamp für jetzt. – user431529

Verwandte Themen