none
insert into mit timestamp RRS feed

  • 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ß

    Sonntag, 10. Oktober 2010 13:40

Antworten

  • Hallo,

    Spalten mit Timestamp bzw. RowVersion werden vom SQL Server automatisch zugewiesen,
    und der Wert ist eindeutig über die gesamte Datenbank, siehe @@DBTS

    Es 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
    Sonntag, 10. Oktober 2010 14:07
    Beantworter

Alle Antworten

  • Hallo,

    Spalten mit Timestamp bzw. RowVersion werden vom SQL Server automatisch zugewiesen,
    und der Wert ist eindeutig über die gesamte Datenbank, siehe @@DBTS

    Es 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
    Sonntag, 10. Oktober 2010 14:07
    Beantworter
  • 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ß

    Sonntag, 10. Oktober 2010 14:20
  • Hallo

    entschuldigen (war ungetestet) und es fehlten die Klammern also SYSUTCDATETIME()

    Gruß Elmar

    Sonntag, 10. Oktober 2010 15:46
    Beantworter
  • Super, läuft, habs gerade getestet :-) DANKE !!!
    Sonntag, 10. Oktober 2010 17:08