2011-01-04 6 views
19

In meiner Datenbank habe ich eine timestamp Spalte. Ich muss eine Zeile in der Tabelle aktualisieren und muss die Spalte timestamp aktualisieren. Wenn ich einen Aktualisierungsbefehl ausführe, erhalte ich:SQL Server aktualisiert eine Zeitstempelspalte

Cannot update a timestamp column. 

Wie kann ich die Timestamp-Spalte aktualisieren?

Antwort

28

Sie nicht

Die timestamp column is updated automatically. Vielleicht haben Sie den Eindruck, dass der Zeitstempel einen Wert enthält, der sich auf die Zeit bezieht? Es ist nicht, aber einfach ist eine Zahl, die immer dann aktualisiert wird, wenn ein Wert in diesem Datensatz ist. Denken Sie daran wie eine Zeile Versionsnummer.

Von MSDN:

Die Zeitstempel-Datentyp ist nur eine fortlaufende Nummer und wird nicht ein Datum oder eine Zeit bewahren.

+9

Sehr intuitiv Benennen dort, ist es nicht ....: P –

+1

@JacquesBosch - ich stimme zu, es ist sehr irreführend –

2

Sie nicht die Timestamp-Spalte aktualisieren - ein Zeitstempel (jetzt umbenannt rowversion) Spalte automatisch von SQL Server aktualisiert wird, wenn eine andere Spalte in der Zeile aktualisiert wird.


Wenn Sie wüssten, dass dies bereits, aber aus irgendeinem Grund die Spalte zwingen wollen zu aktualisieren, führen Sie ein Update gegen die Zeile, die Sie verändern möchten. Auch wenn es in keiner tatsächlichen Datenänderung führt, wird die Timestamp-Spalte noch aktualisiert werden:

create table #T1 (
    ID int not null, 
    ts timestamp not null 
) 
insert into #T1 (ID) 
select 1 union all 
select 2 
select * from #T1 
update #T1 set ID = ID where ID=1 
select * from #T1 

ID ts 
1 0x0000000000039AAF 
2 0x0000000000039AB0 

ID ts 
1 0x0000000000039AB1 
2 0x0000000000039AB0 
2

Obwohl nicht von mir eine Antwort auf Ihre Frage ist, wollte ich erwähnen, wie TIMESTAMP falsch verstanden werden kann.

Sie geben nicht Ihre Verwendung der TIMESTAMP Spalte in Ihrer Frage, aber sie Tatsache, dass Sie versuchen, es zu aktualisieren bedeutet (für mich) Sie versuchen, aufzuzeichnen, wenn sich Ihre Daten ändern.

Werfen Sie einen Blick auf this article (es gibt auch viele andere im Netz) in Bezug auf die Verwendung von TIMESTAMP, wenn Sie tatsächlich die Änderung mit einem DATETIME aufnehmen möchten.

BOL sagt:

Der SQL Server-Zeitstempel-Datentyp nichts mit Zeiten oder Termine zu tun hat. SQL Server-Zeitstempel sind binäre Nummern, die die relative Sequenz angeben, in der Datenänderungen in einer Datenbank stattfanden. Der Zeitstempel-Datentyp wurde ursprünglich implementiert, um die SQL Server Wiederherstellungsalgorithmen zu unterstützen.

Wie Damien_The_Unbeliever sagt der Typ umbenannt wurde und die Beschreibung sagt:

Die rowversion Datentyp ist nur eine fortlaufende Nummer und wird nicht ein Datum oder eine Zeit zu bewahren.Um ein Datum oder eine Uhrzeit aufzuzeichnen, verwenden Sie einen datetime2-Daten- -Typ.

Natürlich, wenn Sie den Datentyp in der Weise bestimmt sind, unter Verwendung ignorieren alle oben :)

+0

Es ist nicht möglich, Datum und Uhrzeit in einer TIMESTAMP-Spalte zu speichern, so dass es nichts zu beachten gibt. Ich denke, diese Antwort ist irreführend. –

+1

@ m.edmondson: Sie haben Recht, der Wortlaut meiner Antwort ist ein bisschen irreführend. Ich folgerte nicht, dass Sally versuchte, einen Datetime-Wert in die Spalte TIMESTAMP zu setzen, nur dass Leute manchmal irrten, dass das TIMESTAMP eine automatische Aufzeichnung des Zeitpunkts, zu dem ein Edit gemacht wurde, liefern würde, und dann zu extrahieren DATETIME ergibt sich aus den Daten. – Tony

1

Timestamp-Spalte kann nicht aktualisiert werden, da sie Server erzeugt und gauranteed für die gesamte eindeutig zu sein Datenbank - Wenn Updates erlaubt sind, was nicht der Fall ist, wird der Wert nicht als einmalig angesehen.

Ich hatte dasselbe Problem beim Aktualisieren der Zeitstempelspalte in einer replizierten Instanz, da die replizierte Instanz nicht den gleichen Zeitstempelwert wie der Herausgeber hatte. Dies verursachte einige Probleme beim Versuch, den letzten aktualisierten Datensatz pro Datensatzgruppe zu erhalten. Bei der Replikation war es natürlich eine einfache Konfiguration im Publisher, um den gleichen Zeitstempelwert für die Replikation auf den Abonnenten zu aktivieren.

Andernfalls gibt es keine andere Möglichkeit, einen Zeitmarkenwert zu aktualisieren.

0

hatte ich das gleiche Problem, meine Lösung:

UPDATE [table] 
SET [ANY_COLUMN] = [ANY_COLUMN] 
WHERE ID = [ID] 

wie zu jeder Zeit, wenn ein Tabellenwert den Zeitstempel ändert neu berechnet wird, ich daher der Zeitstempel aktualisiert wird

jede Spalte auf den gleichen Wert aktualisieren
Verwandte Themen