Please consider this XML:
10
20
select @xml.value('sum(/Parent[@ID = "p"]/Child)', 'float') as Sum
The use of float
protects against there being no Parent
with that ID
. You can then cast this result to int
.
Try this one -
DECLARE @XML XML
SELECT @XML = '
<Parent ID="p">
<Child ID="1">10</Child >
<Child ID="2">20</Child >
<Child ID="3">0</Child >
</Parent >
<Parent ID="p2">
<Child ID="1">15</Child >
<Child ID="2">20</Child >
<Child ID="3">5</Child >
</Parent >'
SELECT
value = SUM(t.value)
, t.id
FROM (
SELECT
value = p.value('.', 'INT')
, id = p.value('./../@ID', 'VARCHAR(50)')
FROM @XML.nodes('/Parent/Child') t(p)
) t
--WHERE t.id = 'p'
GROUP BY t.id
Try this :-
Declare @xml xml
set @xml='<Parent ID="p">
<Child ID="1">10</Child >
<Child ID="2">20</Child >
<Child ID="3">0</Child >
</Parent >'
Select @xml.value('sum(/Parent/Child)','int') as Sum
Result : 30
or if you want the sum for a specific Parent ID
then try the below query
Select @xml.value('sum(/Parent/Child)','int') AS SumVal
where @xml.exist('/Parent[@ID="p"]') = 1;
Demo in SQL FIDDLE
Try this :
DECLARE @SearchKeyWords XML
SET @SearchKeyWords =
'<Parent ID=''p''>
<Child ID="1">10</Child >
<Child ID="2">20</Child >
<Child ID="3">0</Child >
</Parent >'
DECLARE @TempSearchKeyWords TABLE
(
SearchKeyWord INT
)
INSERT INTO @TempSearchKeyWords
SELECT SearchKeyWords.SearchKeyword.value('.',' int ') AS SearchKeyword
FROM @SearchKeyWords.nodes('/Parent/Child') AS SearchKeyWords(SearchKeyword)
SELECT SUM(SearchKeyWord) FROM @TempSearchKeyWords
This will return 30.