Извлечение значения из xml, имеющего данный атрибут со значением, и затем получение значения другого атрибута - PullRequest
0 голосов
/ 06 ноября 2019

У меня есть таблица с типом столбца XML.

Как мне найти значение для автомобильного узла с именем "Ford"?

Кроме того, если Ford там нет, онне должен выдавать ошибку.

    <cars>
      <car name="Honda" value="11" />
      <car name="Toyota" value="22" />
      <car name="Ford" value="3333" />
      <car name="Ferarri" value="444" />
    </cars>

Я не уверен, как установить значение атрибута узла и затем проверить следующее «значение»?

XmlColumn.value('/cars[1]/car[1]/@name["Ford"]/@value', 'nvarchar(max)')

I 'Я пытаюсь сделать выше, но это неправильный синтаксис запроса.

Ответы [ 2 ]

1 голос
/ 06 ноября 2019

Вот еще одна версия, чтобы попробовать. Я также добавил еще одну строку в таблицу с XML без Ford.

SQL

-- DDL and sample data population, start
DECLARE @tbl TABLE (ID INT IDENTITY PRIMARY KEY, xml_data XML);
INSERT INTO @tbl (xml_data)
VALUES
(N'<cars>
      <car name="Honda" value="11" />
      <car name="Toyota" value="22" />
      <car name="Ford" value="3333" />
      <car name="Ferarri" value="444" />
    </cars>')
, (N'<cars>
      <car name="Honda" value="11" />
      <car name="Toyota" value="22" />
      <car name="Ferarri" value="444" />
    </cars>');
-- DDL and sample data population, end

SELECT id, [xml_data].value('(/cars/car[@name="Ford"]/@value)[1]','INT') AS [value]
FROM @tbl AS tbl;

Вывод

+----+-------+
| id | value |
+----+-------+
|  1 | 3333  |
|  2 | NULL  |
+----+-------+
0 голосов
/ 06 ноября 2019

Хорошей идеей является предоставление DDL и выборки совокупности данных при задании вопроса. Ваш начальный XPath определенно отключен. В вашем случае CROSS APPLY необходим для достижения того, что вам нужно. Проверьте это:

SQL

-- DDL and sample data population, start
DECLARE @tbl TABLE (ID INT IDENTITY PRIMARY KEY, xml_data XML);
INSERT INTO @tbl (xml_data)
VALUES
(N'<cars>
      <car name="Honda" value="11" />
      <car name="Toyota" value="22" />
      <car name="Ford" value="3333" />
      <car name="Ferarri" value="444" />
    </cars>');
-- DDL and sample data population, end

SELECT col.value('@value','INT') AS [value]
FROM @tbl AS tbl
    CROSS APPLY tbl.[xml_data].nodes('/cars/car[@name="Ford"]') AS tab(col);

Вывод

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