Структура XML в SQL Server - PullRequest
3 голосов
/ 17 мая 2011

У меня есть следующий код, который работает нормально и возвращает ожидаемые результаты:

DECLARE @xmlList xml
SET @xmlList = '<Tx><T>1</T><T>2</T><T>3</T></Tx>'

SELECT
        X.Y.value('.', 'varchar(10)') AS [ID], 'OK' AS [Status]
    FROM @xmlList.nodes('/Tx/T') X(Y)

Однако он также принимает, когда я предоставляю ему следующую структуру и возвращает те же результаты:

SET @xmlList = '<Tx><T>1</T></Tx><Tx><T>2</T><T>3</T></Tx>'

Обратите внимание, что у меня нет корневого элемента.

У меня вопрос: что мне нужно изменить, чтобы заставить код принять первую структуру как допустимую и отклонить другую?

Спасибо,

TheBlueSky

Ответы [ 3 ]

4 голосов
/ 17 мая 2011

Если вы хотите запросить только один Tx узел (первый), вы можете сделать это

SELECT
  X.Y.value('.', 'varchar(10)') AS [ID], 'OK' AS [Status]
FROM @xmlList.nodes('/Tx[1]/T') X(Y)

Вы также можете проверить количество корневых узлов и вызвать raiserror , если у вас более одного корня.

select @xmlList.query('count(/Tx)').value('.', 'int')

Техника, использованная до того, как xml тип данных принял только один корневой узел. sp_xml_preparedocument вызовет исключение, если существует более одного корня.

declare @idoc int
exec sp_xml_preparedocument @idoc out, @xmlList
exec sp_xml_removedocument @idoc
2 голосов
/ 17 мая 2011

Если вы хотите применить определенную структуру вашего XML, вы можете добавить XML-схему в вашу базу данных SQL Server , чтобы проверить содержимое XML на соответствие схеме.

Go grab Искусство XSD - Коллекции XML-схем SQL Server в виде бесплатной загрузки в формате PDF, чтобы узнать больше об этом

0 голосов
/ 17 мая 2011

Корневой элемент - один и только один раз. Итак, в вашем примере:

; With c as(
SELECT
        X.Y.value('.', 'varchar(10)') AS [ID], 'OK' AS [Status]
    FROM @xmlList.nodes('//Tx') X(Y))
    SELECT COUNT(*) from c

В первом случае вы получите 1, во втором 2.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...