I am trying to extracts some values and colonnes from xml nodes but it is working . this is my code
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)
когда я запустил этот запрос, я получаю нулевые значения.





У вашего узла 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() привело к преимущество в производительности).
вау, просто лучший ответ, большое спасибо @larnu, это отлично работает, как я хотел