3

我们正在尝试根据我们提供的值过滤一组 XML。

我们在数据库的 XML 字段中有以下 XML,如果通过数字“5052095050830”,我们需要在 XML 中找到这个特定节点。我们提供的数字可能存在任何次数。

任何机构都可以提供一些示例 SQL 来提供帮助吗?

谢谢

<Attributes>
  <ProductVariantAttribute ID="4387">
    <ProductVariantAttributeValue>
      <Value>5052095050830</Value>
    </ProductVariantAttributeValue>
  </ProductVariantAttribute>
  <ProductVariantAttribute ID="9999">
    <ProductVariantAttributeValue>
      <Value>5052095050830</Value>
    </ProductVariantAttributeValue>
  </ProductVariantAttribute>
  <ProductVariantAttribute ID="4388">
    <ProductVariantAttributeValue>
      <Value>104401330A</Value>
    </ProductVariantAttributeValue>
  </ProductVariantAttribute>
  <ProductVariantAttribute ID="4389">
    <ProductVariantAttributeValue>
      <Value>6905</Value>
    </ProductVariantAttributeValue>
  </ProductVariantAttribute>
  <ProductVariantAttribute ID="4390">
    <ProductVariantAttributeValue>
      <Value>6906</Value>
    </ProductVariantAttributeValue>
  </ProductVariantAttribute>
  <ProductVariantAttribute ID="4391">
    <ProductVariantAttributeValue>
      <Value>Monday, October 27, 2008</Value>
    </ProductVariantAttributeValue>
  </ProductVariantAttribute>
</Attributes>
4

3 回答 3

3

您可以使用该.exist()方法 - 如下所示:

SELECT 
(list of columns) 
FROM
dbo.YourTable
WHERE
YourXmlColumn.exist('//Value[text()="5052095050830"]') = 1

这会检查您提供的特定值。您可以越精确地定义期望找到该值的 XPath,您的性能就越好。

YourXmlColumn.exist('//Value[text()="5052095050830"]') = 1

非常糟糕 - 它会查看 XML 中任何位置的每个<Value>节点以找到该值。

像这样的东西:

YourXmlColumn.exist('/Attributes/ProductVariantAttribute/ProductVariantAttributeValue/Value[text()="5052095050830"]') = 1

将更加专注,因此性能更好 - 但它只会那些由 XPath 语句定义的特定节点

于 2011-04-15T11:58:39.860 回答
0

这会将值作为另一个 XML 返回,我不确定你想要它。

DECLARE @xml AS XML
SET @xml =
'<Attributes>
  <ProductVariantAttribute ID="4387">
    <ProductVariantAttributeValue>
      <Value>5052095050830</Value>
    </ProductVariantAttributeValue>
  </ProductVariantAttribute>
  <ProductVariantAttribute ID="9999">
    <ProductVariantAttributeValue>
      <Value>5052095050830</Value>
    </ProductVariantAttributeValue>
  </ProductVariantAttribute>
  <ProductVariantAttribute ID="4388">
    <ProductVariantAttributeValue>
      <Value>104401330A</Value>
    </ProductVariantAttributeValue>
  </ProductVariantAttribute>
  <ProductVariantAttribute ID="4389">
    <ProductVariantAttributeValue>
      <Value>6905</Value>
    </ProductVariantAttributeValue>
  </ProductVariantAttribute>
  <ProductVariantAttribute ID="4390">
    <ProductVariantAttributeValue>
      <Value>6906</Value>
    </ProductVariantAttributeValue>
  </ProductVariantAttribute>
  <ProductVariantAttribute ID="4391">
    <ProductVariantAttributeValue>
      <Value>Monday, October 27, 2008</Value>
    </ProductVariantAttributeValue>
  </ProductVariantAttribute>
</Attributes>'


SELECT @xml.query
('
    for $text in //Attributes/ProductVariantAttribute
    where $text/ProductVariantAttributeValue/Value[text()] = 5052095050830
    return string($text/@ID)
')
于 2011-04-15T12:40:10.290 回答
0

如果要在此处检索属性@ID,则为:

        DECLARE @xml AS XML
    SET @xml =
        '<Attributes>
        <ProductVariantAttribute ID="4387">
            <ProductVariantAttributeValue>
                <Value>5052095050830</Value>
            </ProductVariantAttributeValue>
        </ProductVariantAttribute>
        <ProductVariantAttribute ID="9999">
            <ProductVariantAttributeValue>
                <Value>5052095050830</Value>
            </ProductVariantAttributeValue>
        </ProductVariantAttribute>
        <ProductVariantAttribute ID="4388">
            <ProductVariantAttributeValue>
                <Value>104401330A</Value>
            </ProductVariantAttributeValue>
        </ProductVariantAttribute>
        <ProductVariantAttribute ID="4389">
            <ProductVariantAttributeValue>
                <Value>6905</Value>
        </ProductVariantAttributeValue>
        </ProductVariantAttribute>
        <ProductVariantAttribute ID="4390">
            <ProductVariantAttributeValue>
                <Value>6906</Value>
            </ProductVariantAttributeValue>
            </ProductVariantAttribute>
        <ProductVariantAttribute ID="4391">
            <ProductVariantAttributeValue>
                <Value>Monday, October 27, 2008</Value>
        </ProductVariantAttributeValue>
        </ProductVariantAttribute>
    </Attributes>'


    select 
    t.x.value('@ID' ,'varchar(50)') ProductVariantAttributeID
    from @xml.nodes('//ProductVariantAttribute') t(x)
    where t.x.value('(ProductVariantAttributeValue/Value)[1]' , 'nvarchar(50)') = '5052095050830'
于 2013-10-25T08:17:39.387 回答