У меня есть XML-поле внутри таблицы SQL Server, на котором мне нужно знать, используется ли пара ключей/значение с заданным ключом и заданное значение в моей таблице.Найти следующий тег внутри словаря
Итак, вот мой стол (упрощенный).
dbo.mytable:
PrimaryKey, INT
xml_data, NOT NULL
И поле xml_data будет caracterized со следующим XSN:
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xsd:element name="a">
<xsd:complexType>
<xsd:complexContent>
<xsd:restriction base="xsd:anyType">
<xsd:sequence>
<xsd:element name="b" type="NonEmptyString" />
<xsd:element name="c" type="NonEmptyString" />
<xsd:element name="d" type="NonEmptyString" />
<xsd:element name="e" type="xsd:dateTime" />
<xsd:element name="dict">
<xsd:complexType>
<xsd:complexContent>
<xsd:restriction base="xsd:anyType">
<xsd:choice maxOccurs="unbounded">
<xsd:sequence>
<xsd:element name="key" type="NonEmptyString" />
<xsd:element name="value" type="xsd:string" />
</xsd:sequence>
</xsd:choice>
</xsd:restriction>
</xsd:complexContent>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
<xsd:attribute name="version" type="xsd:float" />
</xsd:restriction>
</xsd:complexContent>
</xsd:complexType>
</xsd:element>
<xsd:simpleType name="NonEmptyString">
<xsd:restriction base="xsd:string">
<xsd:minLength value="1" />
</xsd:restriction>
</xsd:simpleType>
</xsd:schema>
Для этого заданного XML (например):
<a>
<b>Value</b>
<c>Value</c>
<d>Value</d>
<e>2017-02-14T00:00:00</e>
<dict>
<key>myKey</key>
<value>myValue</value>
<key>anotherKey</key>
<value>myValue</value>
</dict>
</a>
Мне нужно знать, содержит ли таблица для первого ключа «myKey» значение «myValue».
Я думаю, что могу использовать функцию [xml_data].exist()
, но у меня есть вопросы о том, как должен быть сформирован мой XQuery.
Я начал писать следующую XQuery:
for $key in /a/dict/key where data($key) = ''myKey'' return $key
Но я не могу узнать, как получить следующий тег.
Что может дать "hypotethically" что-то вроде:
SELECT [xml_data].exist('
for $key
in /a/dict/key
where data($key) = ''myKey''
return $key.followingTag == ''myValue''
') FROM dbo.mytable;
Ссылки: https://msdn.microsoft.com/en-us/library/ms189869.aspx