【问题标题】:Converting a varbinary string inside NTEXT to XML using T-SQL?使用 T-SQL 将 NTEXT 中的 varbinary 字符串转换为 XML?
【发布时间】:2016-05-14 02:49:26
【问题描述】:

TL;DR - 我正在尝试将编码为 varbinary、作为跟踪的一部分保存为 NTEXT 字段的 XML 字符串转换回 XML,以便我可以查看它。

背景: 我已经在我们的一台接收 XML 包的服务器上运行了跟踪。它的调用方式是这样的:

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

样本重现:

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

所以现在我需要提取@MSG 并查看XML。

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

这给了我 0xFFFE...

但是如何将字段转换回 XML?

我有一种有效的作弊方式,但很丑陋,一次只能做一排。我毫不怀疑有办法,但我尝试过的每一个基于集合的版本都被卡住了。

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

【问题讨论】:

    标签: sql-server xml tsql


    【解决方案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

    【讨论】:

    • 啊!我没有想过使用子字符串来保持这种格式。谢谢,
    猜你喜欢
    • 2015-08-06
    • 1970-01-01
    • 1970-01-01
    • 2018-01-25
    • 1970-01-01
    • 1970-01-01
    • 2011-06-24
    • 1970-01-01
    • 2012-12-18
    相关资源
    最近更新 更多