从xml节点中提取值

时间:2018-11-02 15:11:32

标签: sql-server xml

  

我正在尝试从xml节点提取一些值和冒号,但它   正在工作中 。这是我的代码

Drop table #TableXML 
CREATE TABLE #TableXML(Col1 int primary key, Col2 xml) 
Insert into #TableXML values ( 1,
'<CookedUP>
  <Evenement Calcul="16">
    <Cookie xmlns="http://services.ariel.morneausobeco.com/2007/02" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
      <AlternateOptionTypeCodes />
      <Cash>0</Cash>
      <CashInterest>0</CashInterest>
      <CashSource>Undefined</CashSource>
      <Code>A</Code>
      <SmallAmount>0</SmallAmount>
      <SmallAmountType>Undefined</SmallAmountType>
    </Cookie>
  </Evenement>
</CookedUP> '
)




SELECT  b.Col1,
        x.XmlCol.value('(Cookie/SmallAmount)[1]','VARCHAR(100)') AS SmallAmount,
        x.XmlCol.value('(Cookie/cash)[1]','VARCHAR(100)') AS cash
FROM    #TableXML b
CROSS APPLY b.Col2.nodes('/CookedUP/Evenement') x(XmlCol)

当我运行此查询时,我得到的是空值。

1 个答案:

答案 0 :(得分:2)

您的节点Cookie有一个名称空间,因此您需要声明该名称空间并将其用作路径的一部分(因为它不是默认名称空间)。另外,您使用的是cash而不是Cash(xQuery区分大小写)。这样就得到:

WITH XMLNAMESPACES ('http://services.ariel.morneausobeco.com/2007/02' AS ns)
SELECT b.Col1,
       x.XmlCol.value('(ns:Cookie/ns:SmallAmount/text())[1]', 'int') AS SmallAmount,
       x.XmlCol.value('(ns:Cookie/ns:Cash/text())[1]', 'int') AS Cash
FROM #TableXML b
     CROSS APPLY b.Col2.nodes('CookedUP/Evenement') x(XmlCol);

我也将数据类型更改为int(这可能不是正确的数据类型,您可能需要decimal),因为数据显然是数字的,并且将/text()添加到值中(我不记得确切的原因,但是使用/text()可以提高性能。