it-swarm.com.de

Wie konvertiert man TIMESTAMP-Werte in V-SAR in T-SQL wie SSMS?

Ich versuche, ein TIMESTAMP-Feld in einer Tabelle in eine Zeichenfolge zu konvertieren, damit es gedruckt oder als Teil von dynamischem SQL ausgeführt werden kann. SSMS ist dazu in der Lage, daher muss eine integrierte Methode vorhanden sein. Ich kann jedoch nicht mit T-SQL arbeiten.

Das folgende zeigt ein Tabellenergebnis korrekt an:

SELECT TOP 1 RowVersion FROM MyTable

Es zeigt 0x00000000288D17AE. Das Ergebnis muss jedoch Teil einer größeren Zeichenfolge sein.

DECLARE @res VARCHAR(MAX) = (SELECT TOP 1 'test' + CONVERT(BINARY(8), RowVersion) FROM MyTable)
PRINT(@res)

Dies ergibt einen Fehler: The data types varchar and binary are incompatible in the add operator

DECLARE @res VARCHAR(MAX) = (SELECT TOP 1 'test' + CONVERT(VARCHAR(MAX), RowVersion) FROM MyTable)
PRINT(@res)

Dies führt zu Müllzeichen: test (®

Tatsächlich sind die Leerzeichen nur Nullzeichen und beenden die Zeichenfolge zum Ausführen von dynamischem SQL mit EXEC().

DECLARE @sql VARCHAR(MAX) = 'SELECT TOP 1 ''test'' + CONVERT(VARCHAR(MAX), RowVersion) FROM MyTable'
EXEC (@sql)

Dies zeigt nur ein Tabellenergebnis mit dem Wort "Test" an. Alles nach "test" im dynamischen SQL wird abgeschnitten, da die CONVERT-Funktion zuerst abschließende Nullzeichen zurückgibt.

Natürlich möchte ich, dass die resultierende Zeichenfolge "test0x00000000288D17AE" oder sogar das Dezimaläquivalent ist, was in diesem Fall "test680335278" wäre.

Alle Ideen wären sehr dankbar.

10
Neo

SELECT 'test' + CONVERT(NVARCHAR(MAX), CONVERT(BINARY(8), RowVersion), 1). Der Trick ist der 1 Zum CONVERT als Stil, gemäß Dokumentation . (Übergeben Sie 2, Um 0x Wegzulassen.)

21
Jeroen Mostert

Wie in den Kommentaren erwähnt, konvertiert die undokumentierte Funktion master.sys.fn_varbintohexstr binär in String, sodass Sie sie mit einem anderen Stringwert verketten können:

DECLARE @binary BINARY(8)
SELECT @binary = CAST(1234567890 AS BINARY(8))

SELECT @binary AS BinaryValue, 
       LEFT(master.sys.fn_varbintohexstr(@binary),2) + UPPER(RIGHT(master.sys.fn_varbintohexstr(@binary),LEN(master.sys.fn_varbintohexstr(@binary))-2)) AS VarcharValue,
       'test' + LEFT(master.sys.fn_varbintohexstr(@binary),2) + UPPER(RIGHT(master.sys.fn_varbintohexstr(@binary),LEN(master.sys.fn_varbintohexstr(@binary))-2)) AS ConcatenatedVarcharValue

Ich habe die ersten beiden Zeichen geteilt und die Funktion UPPER nicht auf sie angewendet, um das Format genau so wiederzugeben, wie es bei einem Binärwert angezeigt wird.

Ergebnisse:

/--------------------------------------------------------------------\
|     BinaryValue    |    VarcharValue    | ConcatenatedVarcharValue |
|--------------------+--------------------+--------------------------|
| 0x00000000499602D2 | 0x00000000499602D2 |  test0x00000000499602D2  |
\--------------------------------------------------------------------/
2
3N1GM4

Guck dir das an:

SELECT 
substring(replace(replace(replace(replace(cast(CAST(GETDATE() AS datetime2) as 
varchar(50)),'-',''),' ',''),':',''),'.',''),1,18)
0
daniel