2011-05-27 47 views
1

我無法弄清楚如何過濾這個xml片段。我想獲得的svcProvNbr其中userServiceCde = OASV在xml中使用xquery過濾結果集sql列

<dataExtract xmlns="http://dtd-sirvahub.sirva.com/xml/SCHEMA/ATS" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://dtd-sirvahub.sirva.com/xml/SCHEMA/ATS http://dtd-sirvahub.sirva.com/xml/SCHEMA/ATS/dataExtract.xsd"> 
    <shipment> 
     <location lctnSeqNbr="001"> 
     <lctnServiceProvider> 
      <userServiceCde>EASV</userServiceCde> 
      <svcProvNbr>1470-000</svcProvNbr> 
      <svcProvTypeCde>A</svcProvTypeCde> 
     </lctnServiceProvider> 
     <lctnServiceProvider> 
      <userServiceCde>OASV</userServiceCde> 
      <svcProvNbr>1470-000</svcProvNbr> 
      <svcProvTypeCde>A</svcProvTypeCde> 
     </lctnServiceProvider> 
     </location> 
    </shipment> 
</dataExtract> 

我已經嘗試了幾種不同的方法,但沒有運氣

xmlalliedxml.query 
    ('declare namespace r = "http://dtd-sirvahub.sirva.com/xml/SCHEMA/ATS"; 
    data(/r:dataExtract/r:shipment/r:location[@lctnSeqNbr=sql:variable("@vcSegmentNo")]/r:lctnServiceProvider.userServiceCde[.="OASV"]/r:svcProvNbr)') 

xmlalliedxml.query 
    ('declare namespace r = "http://dtd-sirvahub.sirva.com/xml/SCHEMA/ATS"; 
    for $sp in /r:dataExtract/r:shipment/r:location[@lctnSeqNbr=sql:variable("@vcSegmentNo")]/r:lctnServiceProvider/r:svcProvNbr 
where $sp/r:dataExtract/r:shipment/r:location[@lctnSeqNbr=sql:variable("@vcSegmentNo")]/r:lctnServiceProvider/r:userServiceCde[.="OASV"] 
return 
$sp') 
+0

如果您發佈代碼,XML或數據樣本,請**在文本編輯器中突出顯示這些行,然後單擊編輯器工具欄上的「代碼示例」按鈕(「{}」)以精確地設置格式和語法突出顯示它! – 2011-05-27 16:32:08

回答

1

試試這個:

DECLARE @input XML = '<dataExtract xmlns="http://dtd-sirvahub.sirva.com/xml/SCHEMA/ATS" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://dtd-sirvahub.sirva.com/xml/SCHEMA/ATS http://dtd-sirvahub.sirva.com/xml/SCHEMA/ATS/dataExtract.xsd"> 
<shipment> 
    <location lctnSeqNbr="001"> 
    <lctnServiceProvider> 
     <userServiceCde>EASV</userServiceCde> 
     <svcProvNbr>1470-000</svcProvNbr> 
     <svcProvTypeCde>A</svcProvTypeCde> 
    </lctnServiceProvider> 
    <lctnServiceProvider> 
     <userServiceCde>OASV</userServiceCde> 
     <svcProvNbr>1470-001</svcProvNbr> 
     <svcProvTypeCde>A</svcProvTypeCde> 
    </lctnServiceProvider> 
    </location> 
</shipment> 
</dataExtract>' 

;WITH XMLNAMESPACES('http://dtd-sirvahub.sirva.com/xml/SCHEMA/ATS' AS ns) 
SELECT 
    @input.value('(ns:dataExtract/ns:shipment/ns:location/ns:lctnServiceProvider[ns:userServiceCde="OASV"]/ns:svcProvNbr)[1]', 
       'varchar(50)') AS 'Service Provider Number" 

我修改了XML,這樣我就可以將兩個條目分開,並且此SELECT語句確實將返回值爲1470-001

更新:到表做到這一點從列,使用此代碼:

;WITH XMLNAMESPACES('http://dtd-sirvahub.sirva.com/xml/SCHEMA/ATS' AS ns) 
SELECT 
    XmlAllied.value('(ns:dataExtract/ns:shipment/ns:location/ns:lctnServiceProvider[ns:userServiceCde="OASV"]/ns:svcProvNbr)[1]', 
       'varchar(50)') AS 'Service Provider Number" 
FROM 
    dbo.AutoExtract 
WHERE 
    (some condition here) 
+0

我該如何從xml列中做這個,而不是一個變量?在這種情況下,我的xml在名爲xmlallied的列名爲autoextract – bubk 2011-05-27 18:31:34

+0

@bubk:更新了我的回答,並附上了一個示例,用於從表格中的列中執行此操作 – 2011-05-27 20:34:35

0

除了什麼marc_s了,你可能要考慮使用CROSS APPLY TableColumn.nodes('/') as t(c) FROM和WHERE之間(含TableColumn是包含XML的列的名稱,然後是括號內的路徑)。