2017-02-14 4 views
1

У меня есть 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

ответ

1

Учитывая следующий ответ: https://stackoverflow.com/a/19253986/3635715
И следующая документация: https://msdn.microsoft.com/en-us/library/ms178030.aspx

Вот XQuery для моей проблемы:
data(/a/dict/value[. >> (/a/dict/key[. = "myKey"])[1]])[1]

Вот ответ на мою проблему:

SELECT COUNT(primaryKey) FROM dbo.mytable 
WHERE [xml_data].value(' 
data(/a/dict/value[. >> (/a/dict/key[. = "myKey"])[1]])[1] 
', 'varchar(max)') = 'myValue' 

Будьте осторожны, этот ответ работает только для первого ключа, соответствующего «MYKEY» найдено.
Для меня это будет случай.

учитывая также ответ: https://stackoverflow.com/a/10408858/3635715
Запрос может быть параметризованный таким образом:

DECLARE @key AS NVARCHAR(max) 
DECLARE @value AS NVARCHAR(max) 

SET @key = N'myKey' 
SET @value = N'myValue' 

SELECT COUNT(primaryKey) FROM dbo.mytable 
WHERE [xml_data].value(' 
    data(/a/dict/value[. >> (/a/dict/key[. = sql:variable("@key")])[1]])[1]', 'varchar(max) 
    ') = @value 
Смежные вопросы