I have two tables:
- One called @settings with xml values
- Another called @nodesToFind with a list of nodes to extract from the xml values in the first table
I want to get a list of the values for each NodePath for each RowId.
This query uses the sql:column
function in the xpath of the values method on the Settings column but it returns the NodePath itself instead of the value:
declare @settings table (RowId int identity, Settings xml)
insert @settings (Settings) values ('<settings><Settings1><Settings1a><Setting1a1>1-1a1</Setting1a1></Settings1a><Setting1b>1-1b</Setting1b><Setting1c>1-1c</Setting1c></Settings1><Settings2><Setting2a>1-2a</Setting2a></Settings2></settings>')
insert @settings (Settings) values ('<settings><Settings1><Settings1a><Setting1a1>2-1a1</Setting1a1></Settings1a><Setting1b>2-1b</Setting1b><Setting1c>2-1c</Setting1c></Settings1><Settings2><Setting2a>2-2a</Setting2a></Settings2></settings>')
insert @settings (Settings) values ('<settings><Settings1><Settings1a><Setting1a1>3-1a1</Setting1a1></Settings1a><Setting1b>3-1b</Setting1b><Setting1c>3-1c</Setting1c></Settings1><Settings2><Setting2a>3-2a</Setting2a></Settings2></settings>')
declare @nodesToFind table (NodePath varchar(max))
insert @nodesToFind (NodePath) values ('/Settings/Settings1/Settings1a/Setting1a1')
insert @nodesToFind (NodePath) values ('/Settings/Settings1/Setting1b')
insert @nodesToFind (NodePath) values ('/Settings/Settings1/Setting1c')
insert @nodesToFind (NodePath) values ('/Settings/Settings2/Setting2a')
select
S.RowId,
NTF.NodePath,
S.Settings.value('(sql:column("NodePath"))[1]', 'varchar(max)')
from @settings S
cross apply @nodesToFind NTF
The result is this:
RowId NodePath Value
----- ----------------------------------------- -----------------------------------------
1 /Settings/Settings1/Settings1a/Setting1a1 /Settings/Settings1/Settings1a/Setting1a1
2 /Settings/Settings1/Settings1a/Setting1a1 /Settings/Settings1/Settings1a/Setting1a1
3 /Settings/Settings1/Settings1a/Setting1a1 /Settings/Settings1/Settings1a/Setting1a1
1 /Settings/Settings1/Setting1b /Settings/Settings1/Setting1b
2 /Settings/Settings1/Setting1b /Settings/Settings1/Setting1b
3 /Settings/Settings1/Setting1b /Settings/Settings1/Setting1b
1 /Settings/Settings1/Setting1c /Settings/Settings1/Setting1c
2 /Settings/Settings1/Setting1c /Settings/Settings1/Setting1c
3 /Settings/Settings1/Setting1c /Settings/Settings1/Setting1c
1 /Settings/Settings2/Setting2a /Settings/Settings2/Setting2a
2 /Settings/Settings2/Setting2a /Settings/Settings2/Setting2a
3 /Settings/Settings2/Setting2a /Settings/Settings2/Setting2a
What is wrong with the S.Settings.value('(sql:column("NodePath"))[1]', 'varchar(max)')
line?