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

<Value>XML 内のすべてのノードを調べて、その値を見つけます。

このようなもの:

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

はるかに焦点が絞られているため、パフォーマンスが大幅に向上しますが、そのXPathステートメントで定義された特定のノードのみになります

于 2011-04-15T11:58:39.860 に答える
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 に答える
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 に答える