| 

.NET C# Java Javascript Exception

2
Ich möchte gerne zu einem Zeitpunkt X die aktuelle RowVersion der DB festhalten.
Dann später mit einer WHERE Klausel prüfen welche Zeile sich in der Tabelle geändert haben, anhand der Timestamp/RowVersion seit dem letzten Stand. Ich bekomme die WHERE Klausel mit dem CONVERT nicht hin. @@DBTS gibt mir den Wert aber wie nutze ich die Hex Zeichenkette mit CONVERT um später z.B so zu prüfen.

SELECT * FROM MyTable WHERE [Timestamp] > ZeitpunktXStempel


Hat so etwas schon mal jemand im MSSQL Server gemacht. Alle CONVERT (varchar(max), oder varbinary laufen nicht.
News:
19.05.2014
dkb 71 1 3
3 Antworten
0
Das wird in T-SQL nicht funktionieren.
Zum Verständnis:
TIMESTAMP bzw. ROWVERSION spiegeln den letzten Schreibzustand einer Zeile wider. Wird die Zeile erneut geschrieben, dann ändert sich der Wert. Dies hat NICHTS mit einer zeitlichen Reihenfolge zu tun!
Die Datentypen dienen dazu, zu erkennen, ob bei einer längeren Aktualisierung die Zeilen zwischenzeitlich verändert wurde. Deshalb der typische Einsatzfall: Einlesen einer Zeile und Darstellung im Dialog, wobei der Dialog den Timestamp vermerkt. Vor dem Update - Prüfung des Timestamps und ggf. Meldung an den Nutzer. Deshalb ist auch größer oder kleiner hier nicht implementiert.

Für das Problem müssen Sie ein eigens Verfahren implementieren, dass auf echten Datumswerten (datetime) basiert, denn Sie wollen bestimmt alle Zeilenversionen aufbewahren. Also typischerweise nur INSERTs mit echtem Zeitstempel via datetime. Dann ist auch die Prüfung möglich.
20.05.2014
edvservice 1,4k 1 6
DateTime2 würde ich dann hier verwenden, da dieser Datentyp eine höhere Genauigkeit als DateTime besitzt aber trotzdem weniger Speicherplatz verbraucht.
Floyd 20.05.2014
0
Wenn es nur darum geht, Änderungen zu erfassen dann funktioniert das sehr wohl.
SET ZeitpunktXStempel = CONVERT(bigint, [timestamp])
merkt sich den Wert des timestamps.
Wichtig: Nicht in der gleichen Tabelle merken ;-)

Bei jeder Änderung in der Datenzeile wird auch der timestamp aktualisiert so dass über die Abfrage
SELECT * FROM MyTable WHERE [Timestamp] > ZeitpunktXStempel
alle veränderten Zeilen erkannt werden.
21.05.2014
0
Hi,

mir ist schon klar, dass der Timestamp keine Zeit ist. Aber ein fortlaufenden Hex Zähler.
Das heißt wenn ich einen festhalte und der Zähler weiter läuft, finde ich doch hoffentlich alle Datensätze die seit dem festgehaltenen angefasst wurden.

So wie Mandy das gezeigt hat, so hatte ich das auch versucht, da tut sich aber nichts.
Ich probiere es nochmal.
21.05.2014
dkb 71 1 3

Stelle deine Programmieren-Frage jetzt!