SQL-запрос для данных XML - PullRequest
       1

SQL-запрос для данных XML

0 голосов
/ 03 апреля 2019

У меня есть таблица базы данных SQL Server со столбцом XML, который содержит данные XML, структурированные так:

<Item xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://test/data">
  <Roots>
    <Root>
      <Name>Field Name</Name>
      <Value>Field Value</Value>
    </Root>
    <Root>
      <Name>Field Name</Name>
      <Value>Field Value</Value>
    </Root>
</Roots>

Я хочу использовать T-SQL, чтобы получить Value, где Name = Total. Я пробовал следующее, но он не возвращает никаких данных:

SELECT [XML]
FROM [BusinessAccount]
WHERE [XML].value('(/Root/Name)[13]', 'VARCHAR(MAX)') LIKE '%Total%'

Если кто-нибудь может сказать мне, где я ошибся?

Ответы [ 2 ]

2 голосов
/ 03 апреля 2019

Вам не хватает обязательного WITH XMLNAMESPACES для вашего XML, и путь указан неверно.

Если вы хотите вернуть строки, в которых 13-й элемент состоит из текста Total, вы можете использовать ниже.

WITH XMLNAMESPACES (DEFAULT 'http://test/data') 
SELECT [XML]
FROM [BusinessAccount]
WHERE 1 = [XML].exist('(/Item/Roots/Root/Name)[13][text() = "Total"]')

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

1 голос
/ 03 апреля 2019

Вам необходимо указать пространства имен. Затем вы можете сопоставить пары <Name> и <Value> и извлечь содержимое <Value> следующим образом:

SELECT NameNode.value('declare namespace x="http://test/data"; (../x:Value)[1]', 'varchar(100)')
FROM [BusinessAccount]
CROSS APPLY [XML].nodes('declare namespace x="http://test/data"; //x:Root/x:Name') AS n(NameNode)
WHERE NameNode.value('.', 'varchar(100)') = 'Total'

Демонстрация по дб <> скрипке

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