我正在尝试从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)
当我运行此查询时,我得到的是空值。
答案 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()
可以提高性能。