【问题标题】:Find the next tag inside a dictionary在字典中查找下一个标签
【发布时间】:2017-02-14 15:49:24
【问题描述】:

我在 SQL Server 表中有一个 XML 字段,我需要知道我的表中是否已经使用了具有给定键和给定值的一对键/值。

这是我的表(简化版)。
dbo.mytable :
主键,INT
xml_data,不为空

xml_data 字段具有以下 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
但我不知道,如何获得以下标签。

这可以“假设地”给出类似的东西:

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

【问题讨论】:

    标签: sql-server dictionary xquery xquery-sql


    【解决方案1】:

    考虑以下答案:https://stackoverflow.com/a/19253986/3635715
    以及以下文档:https://msdn.microsoft.com/en-us/library/ms178030.aspx

    这是我的问题的 XQuery:
    data(/a/dict/value[. &gt;&gt; (/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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-01-03
      • 2014-11-04
      • 1970-01-01
      • 1970-01-01
      • 2013-04-15
      • 1970-01-01
      • 2012-06-04
      • 1970-01-01
      相关资源
      最近更新 更多