Wie wollen Sie konvertieren von VARCHAR in TIMESTAMP in MSSQL?
Würden Sie gerne rufen Sie eine gespeicherte Prozedur in MS SQL, der einen parameter-Typ TIMESTAMP in T-SQL nicht ADO.NET mit einem VARCHAR-Wert (z.B. '0x0000000002C490C8').
Was tun Sie?
UPDATE:
Dies ist, wo Sie einen "Timestamp" - Wert auf Sie zukommen, sondern existiert nur als VARCHAR. (Denken OUTPUT-variable auf eine andere gespeicherte Prozedur, aber es ist bereits behoben, wie VARCHAR, es hat nur den Wert eines ZEITSTEMPELS). Also, wenn Sie sich entscheiden, bauen eine Dynamische SQL-wie kann man programmgesteuert ändern Sie einen Wert, gespeichert in VARCHAR-in einen gültigen TIMESTAMP?
- Ist, dass Werte, wie die Anzahl der Millisekunden seit Beginn der Epoche?
- Nein, es ist datenbankweite eindeutige id. Der name timestamp ist etwas irreführend; es ist eher dem verwandt, was andere Datenbanken nennen eine rowid.
- OK, sorry, nicht so auf MS-SQL-Datentypen, wie ich sein sollte!
- Kein problem, es verwirrt mich auch. (Und ich war nur in der Lage zu sein, die "fastest gun in the west" hier, weil ich buchstäblich nur dies zu tun Forschung den anderen Tag für eine Tabelle in ein Projekt, das ich geerbt ... 🙂
- Oooh ... das update macht dies viel schwieriger!
InformationsquelleAutor Brett Veenstra | 2008-10-10
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einem timestamp-Datentyp von SQL Server verwaltet werden. Ich habe noch nie gesehen, es überall dort verwendet, wo andere als eine Spalte einer Tabelle geben. In dieser Funktion, die die Spalte des Typs timestamp wird Ihnen eine strenge Ordnungszahl des letzten insert - /update-auf die Zeile in der relation zu allen anderen updates in der Datenbank. Finden Sie die aktuellsten Ordnungszahl über die gesamte Datenbank, die Sie abrufen können, den Wert der @@DBTS oder rowversion().
Pro http://msdn.microsoft.com/en-us/library/ms182776(SQL.90).aspx
Daher, den flüchtigen Wert der timestamp-Spalte kann nicht eingestellt werden und ist abhängig von änderung auf alle modifaction auf die Zeile. Sie können jedoch das einfrieren der timestamp-Wert in einer varbinary(8) - Wert.
Zum Beispiel, sagen, Sie hätten eine Quelltabelle und eine Zieltabelle.
CREATE TABLE tblSource (
Id int not null
colData int not null
colTimestamp timestamp null)
CREATE TABLE tblTarget (
Id int not null
colData int not null
colTimestampVarBinary varbinary(8) null)
Dann, in einem Extraktions-Prozess, möchten Sie vielleicht, um alles zu erfassen, die aktualisiert wurde, seit Sie das Letzte mal lief der Extraktion.
DECLARE @maxFrozenTargetTimestamp varchar(8)
SELECT @maxFrozenTargetTimestamp = max(colStamp) FROM tblTarget
INSERT tblTarget(Id, colData, colTimestampVarBinary)
SELECT
Id
,colData
, colTimestampVarBinary = convert(varbinary(8) colTimestamp)
FROM
tblSource
WHERE
tblSource.colTimestamp > @maxFrozenTargetTimestamp
Wenn Sie Probleme haben, meine erste Vermutung wäre, dass der Kern des Problems
ist die Umwandlung eines varchar in einer varbinary(8), und nicht, um einen Zeitstempel geben.
Weitere Infos (vielleicht zu viel) , siehe auch den Kommentar (vierte unten), habe ich Links zu den blog-post http://vadivel.blogspot.com/2004/10/about-timestamp-datatype-of-sql-server.html?showComment=1213612020000
Seit timestamp ist kompatibel mit varbinary die Lösung sein wird, dies in SQL Server 2008:
Referenz. MSN-Blogs
TIMESTAMP ist semantisch äquivalent zu VARBINARY(8) (nullable) oder BINARY(8) (ungleich null). So sollten Sie in der Lage sein, um den Aufruf der Prozedur mit dem parameter ohne Anführungszeichen, wie folgt:
Siehe auch SQL Books Online
BEARBEITEN aktualisierte Frage ...
Ich habe gerade versucht ein paar Experimente. Ehrlich gesagt, ich bin neugierig, wie Sie diese vertreten als varchar in den ersten Platz, da wenn ich etwas mache wie:
Wo ist ts ein Zeitpunkt ist, bekomme ich 10 leere Zeilen. (Wenn ich nicht konvertieren, ich sehe meine timestamps.)
Jedoch habe ich versucht, arbeiten Sie von der richtigen Richtung ... ich habe diese:
Und die Umwandlung führte zu
0x3078303030303030
. Damit wird nicht spielen. Noch wird die Umwandlung in eine Binärzahl um.Ich hasse es zu sagen, aber vielleicht sind Sie stecken in einem dynamischen SQL-Welt. Ich würde wirklich mag falsch sein, aber.