Benutzer mit den meisten Antworten
insert into mit timestamp

Frage
-
Hallo,
ich habe eine Frage zum Einfügen von Tabellenwerten in eine andere Tabelle unter Verwendung eines timestamps.
Ich habe eine TabelleA und Tabelle B und möchte alle Werte von A nach B kopieren. Dazu verwende ich
insert into TableB ([LayerID],[Name]) SELECT [ID] ,[Name] from Tabelle A
Die Tabelle B verfügt außerdem noch die Spalte History_timestamp. Als Datentyp habe ich timestamp verwendet. Der Inhalt von History_timestamp soll automatisch berechnet werden. Dazu habe ich unter ComputedValues(oder so ähnlich) GetDate() eingetragen
Beim Ausführen wird auch der aktuelle Wert in die Tabelle geschrieben, führe ich die Anweisung nochmal aus werden zwar wie gewünscht alle Daten richtig kopiert, aber der history_timestamp wird überall auf den aktuellen wert gesetzt, und das will ich natürlich nicht...
Hintergrund ist, wie man am namen schon sehen kann, eine Art Historie in die Daten zu bringen....
Hat jemand eine idee was ich falsch mache?
gruß
Antworten
-
Hallo,
Spalten mit Timestamp bzw. RowVersion werden vom SQL Server automatisch zugewiesen,
und der Wert ist eindeutig über die gesamte Datenbank, siehe @@DBTSEs handelt sich dabei um keinen Datums-/Zeitwert, sondern um einen (64-Bit) Zählerwert.
Du kannst den Wert also nicht beeinflussen, und bei einem Übertragen
in eine andere Tabelle erhalten die Zeilen immer einen neuen Wert.
Ein Standardwert gibt für Timestamp-Spalten ebenfalls keinen Sinn.Willst Du einen "echten" Datumswert, so verwende einen Datetime(2) Datentyp
und hinlege dort als Standardwert wie z. B. SYSUTCDATETIME . Bei Änderungen mußt
Du diesen aber manuell pflegen bzw. durch einen Trigger automatisch aktualisieren.Einfaches Beispiel (ungetestet):
CREATE TABLE dbo.Tabelle ( Id int NOT NULL, Name nvarchar(40) NOT NULL, HistoryDate datetime2 CONSTRAINT DF_Tabelle_HistoryDate DEFAULT (SYSUTCDATETIME()), HistoryTimestamp timestamp NOT NULL, CONSTRAINT PK_Tabelle PRIMARY KEY (Id) ); -- Übertragen INSERT INTO dbo.Tabelle (Id, Name) SELECT LayerID, Name FROM TabelleA; -- Ergebnis SELECT * FROM dbo.Tabelle;
wobei Du dann alle mit der aktuellen Systemzeit hast.
Und ob Du nun weiterhin die TimeStamp Spalten verwendest, sei Dir überlassen.Gruß Elmar
- Bearbeitet Elmar BoyeEditor Sonntag, 10. Oktober 2010 15:45 SYSUTCDATETIME()
- Als Antwort markiert Dru_MS Sonntag, 10. Oktober 2010 17:08
Alle Antworten
-
Hallo,
Spalten mit Timestamp bzw. RowVersion werden vom SQL Server automatisch zugewiesen,
und der Wert ist eindeutig über die gesamte Datenbank, siehe @@DBTSEs handelt sich dabei um keinen Datums-/Zeitwert, sondern um einen (64-Bit) Zählerwert.
Du kannst den Wert also nicht beeinflussen, und bei einem Übertragen
in eine andere Tabelle erhalten die Zeilen immer einen neuen Wert.
Ein Standardwert gibt für Timestamp-Spalten ebenfalls keinen Sinn.Willst Du einen "echten" Datumswert, so verwende einen Datetime(2) Datentyp
und hinlege dort als Standardwert wie z. B. SYSUTCDATETIME . Bei Änderungen mußt
Du diesen aber manuell pflegen bzw. durch einen Trigger automatisch aktualisieren.Einfaches Beispiel (ungetestet):
CREATE TABLE dbo.Tabelle ( Id int NOT NULL, Name nvarchar(40) NOT NULL, HistoryDate datetime2 CONSTRAINT DF_Tabelle_HistoryDate DEFAULT (SYSUTCDATETIME()), HistoryTimestamp timestamp NOT NULL, CONSTRAINT PK_Tabelle PRIMARY KEY (Id) ); -- Übertragen INSERT INTO dbo.Tabelle (Id, Name) SELECT LayerID, Name FROM TabelleA; -- Ergebnis SELECT * FROM dbo.Tabelle;
wobei Du dann alle mit der aktuellen Systemzeit hast.
Und ob Du nun weiterhin die TimeStamp Spalten verwendest, sei Dir überlassen.Gruß Elmar
- Bearbeitet Elmar BoyeEditor Sonntag, 10. Oktober 2010 15:45 SYSUTCDATETIME()
- Als Antwort markiert Dru_MS Sonntag, 10. Oktober 2010 17:08
-
Hi ,
danke erstmal für deine Antwort.
Ich hab da mal eben nur kurzen blick drauf geworfen... und deine anweisung ausgeführt.
die wirft nen Fehler
>>Meldung 128, Ebene 15, Status 1, Zeile 6
Der Name 'SYSUTCDATETIME' ist in diesem Kontext nicht zulässig. Gültige Ausdrücke sind Konstanten, konstante Ausdrücke und (in bestimmten Kontexten) Variablen. Spaltennamen sind nicht zulässig.<<ich schau mir das heute abend aber nochmal genauer an. Danke nochmal !
Gruß