Я хотел бы разместить альтернативу:
(Кредиты Ицхаку Хабинскому для MCVE - +1 с моей стороны):
DECLARE @tbl TABLE (ID INT IDENTITY(1,1) PRIMARY KEY, xml_data XML);
INSERT INTO @tbl (xml_data)
VALUES
(N'<dictionary>
<item>
<key>
<string>MemberNumber</string>
</key>
<value>
<string>66962336209</string>
</value>
</item>
</dictionary>');
- Мы можем использовать внешнийпеременная, чтобы получить это более общее
DECLARE @KeyName VARCHAR(100)='MemberNumber';
- запрос
SELECT t.ID
,t.xml_data.value('(/dictionary
/item[key/string/text()=sql:variable("@KeyName")]
/value
/string
/text())[1]','varchar(30)')
FROM @tbl t
--This WHERE is not mandatory, but it might speed things up
--(if there are many items and many rows without this key)
WHERE t.xml_data.exist('/dictionary[item/key/string/text()=sql:variable("@KeyName")]')=1;
Идея вкратце:
- Мы объявляем имя ключа мынаходясь в поиске. Это позволяет использовать переменную для получения универсального значения apprach.
- В
WHERE
-классе вызывается .exist()
. Попробуйте это. Вам это не нужно, но оно может получить некоторую скорость (в зависимости от ваших данных). - Функция
.value()
понижается до /dictionary/item
, но использует предикат для фильтрации для одного <item>
, где есть ключ с указанным именем. Используя это <item>
, мы углубляемся в <value>
и читаем его содержимое.