2011-04-15 107 views
3

我們試圖根據我們提供的值過濾一組XML。SQL Server 2008 XPath

在我們的數據庫的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> 

回答

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語句定義的那些那些特定的節點

+0

謝謝 - 我幾乎沒有了。我試圖讓這樣的工作。這是要麼零結果。我究竟做錯了什麼? 'DECLARE @Barcode VARCHAR SELECT @Barcode = '5052095050830' SELECT * FROM Nop_ProductVariantAttributeCombination WHERE AttributesXml.exist('/屬性/ ProductVariantAttribute/ProductVariantAttributeValue /值[文本()= 「SQL:可變(@Barcode)」 ]')= 1' – ajbrun 2011-04-15 13:24:18

+2

@Adrian:不確定 - 但你應該嘗試使用'sql:variable':'/ Value [text()= sql:variable(@Barcode)]'' - 你也可以想在聲明它的時候給你的'@ Barcode'變量一個長度 - 否則它是'VARCHAR(1)',我相信... – 2011-04-15 14:03:27

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) 
') 
+0

把它改爲:''104401330A'for varchar,sorry – SQLMason 2011-04-15 15:23:19

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'