#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)');