2016-05-13 6 views
0

TL; DR - Ich versuche, eine XML-Zeichenfolge, die als varbinary codiert ist, als Teil einer Ablaufverfolgung in ein NTEXT-Feld gespeichert, zurück zu XML, damit ich es anzeigen kann.Konvertieren einer varbinary Zeichenfolge in NTEXT zu XML mit T-SQL?

Hintergrund: Ich habe eine Ablaufverfolgung über einen unserer Server, die XML-Pakete empfängt, ausgeführt. So, wie es genannt wird wie folgt aussieht:

exec sp_executesql N'EXEC dbo.myproc @MSG',N'@MSG varbinary(max) ',@MSG=0xFFFE3... 

Probe Repro:

DECLARE @msg XML = '<A> 
    <B> 
    <C>1</C> 
    </B> 
</A>' 
SELECT CONVERT(VARBINARY(max),@msg) 
--0xFFFE3C0041003E003C0042003E003C0043003E0031003C002F0043003E003C002F0042003E003C002F0041003E00 
USE tempdb 
GO 
CREATE TABLE faketrace (id int identity, textdata NTEXT) 
CREATE TABLE finished_trace (id int identity, data_value XML) 
GO 
INSERT INTO faketrace 
     (textdata) 
VALUES ('exec sp_executesql N''EXEC dbo.myproc @MSG'',N''@MSG varbinary(max)'',@MSG=0xFFFE3C0041003E003C0042003E003C0043003E0031003C002F0043003E003C002F0042003E003C002F0041003E00') -- textdata - ntext 

So, jetzt muss ich die @MSG extrahieren und die XML anzuzeigen.

SELECT STUFF(CAST(textdata AS NVARCHAR(max)),1,71,'') FROM faketrace 

, die mir die 0xFFFE gibt ...

Aber wie konvertiere ich das Feld XML zurück?

Ich habe einen Cheat-Weg, der funktioniert, aber ist hässlich, und macht nur eine Reihe zu einer Zeit. Ich habe keinen Zweifel, dass es einen Weg gibt, aber jede Set-basierte Version, die ich ausprobiert habe, hat gewürgt.

DECLARE @min int, @max INT, @sql NVARCHAR(MAX) 
SELECT @min = MIN(id) , @max = MAX(id) FROM faketrace 
WHILE @min <= @max 
BEGIN 
    SET @sql = NULL 
    SELECT @sql = 'declare @msg varbinary(max) 
    set @msg = ' + CAST(STUFF(CONVERT(NVARCHAR(MAX),TextData),1,71,'') AS NVARCHAR(MAX)) 
    + ' 
    select convert(xml, @msg)' FROM faketrace WHERE id = @min 
    INSERT INTO finished_trace (data_value) 
    EXEC (@sql) 
    SET @min = @min + 1 
END 

Antwort

1
SELECT 
    textdata, 
    CAST(textdata AS NVARCHAR(max)), 
    -- use SUBSTRING instead of STUFF, but LEN won't take an NTEXT, so cast to NVARCHAR 
    SUBSTRING(textdata, 72, LEN(CAST(textdata AS NVARCHAR(max))) - 71), 
    -- you can use CONVERT with the third argument of 1 
    CONVERT(VARBINARY(MAX), SUBSTRING(textdata, 72, LEN(CAST(textdata AS NVARCHAR(max))) - 71), 1), 
    -- now that you have a valid VARBINARY, you can directly cast to XML 
    CAST(CONVERT(VARBINARY(MAX), SUBSTRING(textdata, 72, LEN(CAST(textdata AS NVARCHAR(max))) - 71), 1) AS XML) 
FROM faketrace 

varbinary to string on SQL Server

https://msdn.microsoft.com/en-us/library/ms187928.aspx

+0

Ah! Ich hatte nicht daran gedacht, den Teilstring zu verwenden, um ihn in diesem Format zu behalten. Vielen Dank, – mbourgon

Verwandte Themen