Frage

Sie möchten, dass eine gespeicherte Prozedur auf MS SQL aufrufen, die einen Parametertyp STAMP innerhalb von T-SQL hat, nicht ADO.NET einen VARCHAR-Wert (z.B. ‚0x0000000002C490C8‘).

Was möchten Sie tun?

UPDATE: Hier können Sie ein „Timestamp“ Wert haben kommen auf Sie, sondern existiert nur als VARCHAR. (Man denkt OUTPUT-Variable auf einer anderen gespeicherte Prozedur, aber es ist behoben bereits als VARCHAR, es nur den Wert eines Zeitstempels hat). Also, wenn Sie dynamische SQL entscheiden zu bauen, wie Sie programmatisch einen Wert in VARCHAR in einen gültigen Zeitstempel gespeichert ändern?

War es hilfreich?

Lösung

Ein Zeitstempel-Datentyp wird von SQL Server verwaltet. Ich habe es nie irgendwo anders gesehen verwendet als als Tabellenspalte Typ. In dieser Eigenschaft wird die Spalte vom Typ Zeitstempel geben Sie eine strenge Ordnungs des letzten insert / update auf die Zeile in Bezug auf alle anderen Updates in der Datenbank. Um zu sehen, die letzte Ordnungs über die gesamte Datenbank, können Sie den Wert von @@ DBTS abrufen oder rowversion ().

http://msdn.microsoft.com /en-us/library/ms182776(SQL.90).aspx

Zeitstempel (Transact-SQL)

ist ein Datentyp, der automatisch generierte, eindeutige binäre Zahlen in einer Datenbank verfügbar macht. Zeitstempel wird als ein Mechanismus für die Version Prägetabellenzeilen verwendet. Die Speichergröße ist 8 Byte. Der Zeitstempel-Datentyp ist nur eine fortlaufende Nummer und erhält nicht ein Datum oder eine Zeit. Um ein Datum oder Zeit aufzuzeichnen, eine Datumsdatentyp verwenden.

Daher kann die flüchtige Wert eines Zeitstempel-Spalte nicht eingestellt werden und wird auf jede modifaction zu der Zeile ändern. Sie können jedoch einfrieren den Zeitstempel-Wert auf einen varbinary (8) Wert.

Zum Beispiel, sagen Sie eine Quellentabelle haben 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 wird in einem Extraktionsverfahren, möchten Sie vielleicht alles erfassen, die seit dem letzten Mal aktualisiert wurde Sie den Extraktionsprozess ausgeführt wurde.

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 Kernpunkt des Problems sein ist in der Umwandlung eines an einem VARCHAR varbinary (8) und nicht auf einen Zeitstempel-Typen.

Für weitere Informationen (vielleicht zu viel), siehe den Kommentar (vierte unten) ich die Blog-Post links http://vadivel.blogspot.com/2004/10/about-timestamp-datatype-of-sql-server.html?showComment= 1213612020000

Andere Tipps

Da Zeitstempel mit varbinary kompatibel ist die Lösung wird dies in SQL Server 2008:

declare @hexstring varchar(max);
set @hexstring = '0xabcedf012439';
select CONVERT(varbinary(max), @hexstring, 1);

set @hexstring = 'abcedf012439';
select CONVERT(varbinary(max), @hexstring, 2);

Referenz. MSN Blogs

Ein Zeitstempel wird semantisch äquivalent VARBINARY (8) (nullable) oder BINARY (8) (nicht-nullable). So sollten Sie in der Lage sein, die Prozedur mit dem Parameter unquoted zu nennen, wie folgt:

EXEC usp_MyProc @myParam=0x0000000002C490C8

Siehe auch SQL-Online

EDIT für aktualisiertem Frage ...

Ich habe gerade versucht, ein paar Experimente. Ehrlich gesagt, ich bin gespannt, wie Sie dies als varchar in erster Linie vertreten hätten, da, wenn ich so etwas wie:

select top 10 convert(varchar, ts) from foo

Wo ts ein Zeitstempel ist, erhalte ich 10 leere Zeilen. (Wenn ich nicht konvertieren, ich sehe meinen Zeitstempel).

Allerdings habe ich versucht, es aus der richtigen Richtung arbeiten ... Ich tat dies:

select convert(timestamp, '0x0000000000170B2E')

Und die Umwandlung in Folge 0x3078303030303030. So wird das auch nicht spielen. Auch wird die Umwandlung in binäre.

Ich hasse es zu sagen, aber Sie könnten in einer dynamischen SQL-Welt stecken. Ich würde wirklich mag falsch sein, aber.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top