Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

T-SQL retrieving sql attribute from xml using variable

I am trying to retrieve an XML attribute from an XML variable passing in the name of the desired attribute. The first select statement works just fine retrieving the correct attribute values. However, when I try to set within a SQL variable the desired attribute name, all that is displayed is the string /root/attribs/@id instead of the actual value. I have tried numerous permutations of the @path variable, all to no avail.

What am I missing here?

DECLARE @XMLString XML = '<root><attribs flags="1" id="test_id" platform="test_platform" /></root>';

SELECT
    flags = x.c.value('(/root/attribs/@flags)[1]', 'nvarchar(50)') ,
    id = x.c.value('(/root/attribs/@id)[1]', 'nvarchar(50)') ,
    [platform] = x.c.value('(/root/attribs/@platform)[1]', 'nvarchar(50)')
FROM
    @XMLString.nodes('/*') x ( c );

DECLARE @Path NVARCHAR(50) = '/root/attribs/@id';
SELECT
    result = x.c.value('(sql:variable("@Path"))[1]', 'nvarchar(50)')
FROM
    @XMLString.nodes('/*') x ( c );
like image 799
Don Bouchard Avatar asked Nov 26 '25 19:11

Don Bouchard


1 Answers

This will allow you to specify the attribute name.

DECLARE @XMLString xml = '
  <root>
    <attribs flags="1" id="test_id" platform="test_platform" />
  </root>'

DECLARE @Attribute nvarchar(max) = 'flags'

SELECT
  t.x.value('(/root/attribs/@*[local-name() = sql:variable("@Attribute")])[1]', 'nvarchar(max)')
FROM @XMLString.nodes('/*') t(x)
like image 191
jdl Avatar answered Nov 28 '25 08:11

jdl