SQL Server десериализует XML с помощью OPENXML

#sql-server #xml-deserialization

Вопрос:

Я прочитал эту документацию, описывающую, как десериализовать xml в таблицу : https://docs.microsoft.com/en-us/sql/t-sql/functions/openxml-transact-sql?view=sql-server-ver15

В моем сценарии каждый XML-файл представляет собой «таблицу» только с одной строкой, поэтому я написал этот код:

 DECLARE @data AS NVARCHAR(4000) = N'<row ACOCLI="cod" ARAGS1="Some description" 
ACOFIS="cod" AEMAIL=" " ACOAGE="  " AANNUL=" " ANOMIG="Some Name"/>';
SELECT *  
FROM OPENXML (@data,'row' ,0);
 

https://dbfiddle.uk/?rdbms=sqlserver_2019amp;fiddle=94d10fa2f6c4f0eb580d5166c07f4553

Мне неясно, использовал ли я правильный корневой узел, и в случае, если «строка» неверна, какой узел здесь правильный. Ошибка, которую я получаю, также странная, в ней говорится о приведении к int, но там нет int, только XML.

Ошибка:

Msg 245 Уровень 16 Состояние 1 Строка 2 Не удалось выполнить преобразование при преобразовании значения nvarchar в тип данных int.

То, что я ожидаю, — это такой результат выбора:

АКОКЛИ АРАГС1 АКОФИС СООБЩЕНИЕ ЭЛЕКТРОННОЙ ПОЧТЫ ACOAGE ААННУЛЪ АНОМИГ
треска Некоторое описание треска Какое-То Имя

Комментарии:

1. @data должно быть xml не а nvarchar .

2. Не используй OPENXML это древнее

Ответ №1:

Похоже, что на самом деле вам просто нужно, чтобы value оператор:

 DECLARE @data AS xml = N'<row ACOCLI="00330" ARAGS1="Some description" ACOFIS="01266820248" AEMAIL=" " ACOAGE="  " AANNUL=" " ANOMIG="Some Name"/>';

SELECT @data.value('(row/@ACOCLI)[1]','varchar(6)'),
       @data.value('(row/@ARAGS1)[1]','varchar(30)'),
       @data.value('(row/@ACOFIS)[1]','varchar(15)'),
       @data.value('(row/@AEMAIL)[1]','varchar(6)'),
       @data.value('(row/@ACOAGE)[1]','varchar(6)'),
       @data.value('(row/@AANNUL)[1]','varchar(6)'),
       @data.value('(row/@ANOMIG)[1]','varchar(15)');