Преобразование всего столбца таблицы varchar/varbinary в xml

У меня есть таблица с одним из столбцов в виде varbinary, которая на самом деле содержит строку в кодировке base64.

Table: Messages
Id        |   int
Payload   |   varbinary(MAX)

Я могу увидеть его содержимое, используя

select cast(Payload as varchar(max)) from Messages

Однако мне нужно преобразовать весь столбец в XML, чтобы такого рода приведение не требовалось, и я мог хранить гораздо более длинные строки в виде XML. Для одной записи я могу сделать что-то вроде

select convert(xml, (select top 1 cast(payload as varchar(max)) 
                     from Messages
                    )
              ) as PayLoad 
for XML PATH('');

Как преобразовать всю таблицу в xml?

Спасибо


person sppc42    schedule 24.03.2016    source источник


Ответы (2)


Это должно сработать для вас:

CREATE TABLE #temp(ID INT,PayLoad VARBINARY(MAX));
INSERT INTO #temp VALUES
                 (1,CAST('AAQSkZJRgABAQEAYABgAAD/4RDmRXhpZg' AS VARBINARY(MAX)))
                ,(2,CAST('AAAAJAAAISodpAAQAAAABAAAIVJydAAEAAAASAAAQz' AS VARBINARY(MAX)));  

--simple output
SELECT * 
FROM #temp;

--casted output
SELECT ID,CAST(PayLoad AS VARCHAR(MAX)) AS PayLoad 
FROM #temp;

--AS XML
SELECT ID
      ,CAST(PayLoad AS VARCHAR(MAX)) AS PayLoad
FROM #temp 
FOR XML PATH('Row'),ROOT('root');

--EDIT: new SELECT
--As table with Payload as XML
SELECT ID
      ,(SELECT CAST(PayLoad AS VARCHAR(MAX)) FOR XML PATH('PayLoad'),TYPE) AS PayLoad
FROM #temp 

DROP TABLE #temp;
person Shnugo    schedule 24.03.2016
comment
Это вернет всю таблицу в одном запросе. Вместо этого я хочу получить все строки, как в обычном операторе выбора, со столбцами base64, отображаемыми для каждой строки в виде XML. Что-то вроде «SELECT Id, CAST (PayLoad AS varchar (MAX)) as PayLoad FROM Messages». Это вернет мне всю таблицу в виде сетки с полезной нагрузкой в ​​декодированной строке. Я хочу, чтобы это был XML вместо каждой строки - person sppc42; 30.03.2016
comment
Является ли содержимое вашей строки base64 XML? Я добавил еще один выбор в свой код, чтобы дать вам то, что вы пишете, но я сомневаюсь, что это то, что вы хотите... - person Shnugo; 30.03.2016

Как насчет использования for xml path?

select cast(Payload as varchar(max))
from Messages
for xml path ('');

Вы можете включить соответствующие аннотации. Вы также можете иметь несколько столбцов. Документация находится здесь.

person Gordon Linoff    schedule 24.03.2016
comment
Это вернет всю таблицу в одном запросе. Вместо этого я хочу получить все строки, как в обычном операторе выбора, со столбцами base64, отображаемыми для каждой строки в виде XML. Что-то вроде «SELECT Id, CAST (PayLoad AS varchar (MAX)) as PayLoad FROM Messages». Это вернет мне всю таблицу в виде сетки с полезной нагрузкой в ​​декодированной строке. Я хочу, чтобы это был XML вместо каждой строки - person sppc42; 30.03.2016