2017-02-14 6 views
1

XML 테이블에 XML 필드가 있습니다. 여기에 주어진 키와 주어진 값을 가진 몇 개의 키/값이 이미 내 테이블에서 사용되는지 알아야합니다.사전 내에서 다음 태그 찾기

여기 내 테이블 (간체)입니다.
dbo.mytable :
기본 키, INT NULL NOT
xml_data,

그리고 xml_data 필드는 다음 XSN로 특징 지어된다 (예를 들어)이 주어진 XML에 대한

<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> 

:

<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"을 대응하는 제 키를 작동 : 여기

내 문제에 대한 답변입니다.
내가 어떤 경우에 해당 할 것인가.

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 
: 쿼리는이 방법을 매개 변수화 할 수 https://stackoverflow.com/a/10408858/3635715
:

또한이 대답을 고려