XQUERY - How to use sql: variable in 'value () function?

The query below attempts to select the node child of this Node. How to use a variable instead of hard coding a child node so that I can pass them as parameters to SProc?

declare @T table(XMLCol xml) insert into @T values ('<Root xmlns="http://tempuri.org" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <Elem1 type="T1"> <Name type="string" display="First name">John</Name> <TimeZone display="Time zone"> <children> <DisplayName type="string" display="Display name">GMT Standard Time</DisplayName> <HiddenName type="string" display="Hidden name">GMT</HiddenName> </children> </TimeZone> </Elem1> </Root>') declare @Node varchar(50) set @Node = 'TimeZone' select N.value('(children/DisplayName)[1]', 'varchar(100)') as Value from @T as T cross apply T.XMLCol.nodes('//*[local-name()=sql:variable("@Node")]') as X(N) 
+6
source share
2 answers
 declare @T table(XMLCol xml) insert into @T values ('<Root xmlns="http://tempuri.org" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <Elem1 type="T1"> <DisplayName type="string" display="Display name">No this</DisplayName> <Name type="string" display="First name">John</Name> <TimeZone display="Time zone"> <children> <DisplayName type="string" display="Display name">GMT Standard Time</DisplayName> <HiddenName type="string" display="Hidden name">GMT</HiddenName> </children> </TimeZone> </Elem1> </Root>') declare @Node1 varchar(50) set @Node1 = 'TimeZone' declare @Node2 varchar(50) set @Node2 = 'DisplayName' select N2.Value.value('.', 'varchar(100)') as Value from @T as T cross apply (select T.XMLCol.query('//*[local-name()=sql:variable("@Node1")]')) as N1(Value) cross apply (select N1.Value.query('//*[local-name()=sql:variable("@Node2")]')) as N2(Value) 
+5
source
 declare @Node varchar(50) set @Node = 'TimeZone' declare @ChildName varchar(50) set @ChildName='HiddenName' ;WITH XMLNAMESPACES(DEFAULT 'http://tempuri.org') select N.value('.', 'varchar(100)') as Value from @T as T cross apply T.XMLCol.nodes('//*[local-name()=sql:variable("@Node")]/children/*[local-name(.)=sql:variable("@ChildName")]') as X(N) 
+1
source

Source: https://habr.com/ru/post/894811/


All Articles