在字典中查找下一个标签
Find the next tag inside a dictionary
我在 SQL 服务器 table 中有一个 XML 字段,我需要在上面知道一对 key/value 是否具有给定的键和给定的值已经在我的 table.
中使用了
这是我的table(简体)。
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>
我需要知道 table 是否包含第一个键 "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
考虑以下答案:
以及以下文档: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
我在 SQL 服务器 table 中有一个 XML 字段,我需要在上面知道一对 key/value 是否具有给定的键和给定的值已经在我的 table.
中使用了这是我的table(简体)。
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>
我需要知道 table 是否包含第一个键 "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
考虑以下答案:
以及以下文档: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