patternsqlMinor
OPENXML to get content by using element and attribute name
Viewed 0 times
andopenxmlgetusingelementattributecontentname
Problem
In this SQL Server OPENXML example:
This is the current output:
But I really want this output:
To identify the content, I cannot use "var" alone, because all elements of interest are named "var". I cannot use position [1] or [2], because the position numbers are inconsistent in the XML, resulting in the current mixed-up output. How do I identify the elements based on "var" and the "dimension" attribute names of "task" or "startdate"?
declare @xmldata xml
set @xmldata =
'
Task 1
2020-11-14
2020-11-15
Task 2
'
DECLARE @hDoc int
EXEC sp_xml_preparedocument @hDoc OUTPUT, @xmldata
SELECT *
FROM OPENXML(@hDoc, '//wddxPacket/data',2)
WITH(
task varchar(200) 'var[1]/string',
startdate varchar(200) 'var[2]/string'
)
EXEC sp_xml_removedocument @hDocThis is the current output:
task startdate
------ ----------
Task 1 2020-11-14
2020-11-15 Task 2But I really want this output:
task startdate
------ ----------
Task 1 2020-11-14
Task 2 2020-11-15To identify the content, I cannot use "var" alone, because all elements of interest are named "var". I cannot use position [1] or [2], because the position numbers are inconsistent in the XML, resulting in the current mixed-up output. How do I identify the elements based on "var" and the "dimension" attribute names of "task" or "startdate"?
Solution
You need to use a different XPath expression to match the attribute values, eg
Like this:
outputs
var[@dimension="task"]/string.Like this:
declare @xmldata xml
set @xmldata =
'
Task 1
2020-11-14
2020-11-15
Task 2
'
DECLARE @hDoc int
EXEC sp_xml_preparedocument @hDoc OUTPUT, @xmldata
SELECT *
FROM OPENXML(@hDoc, '/wddxPacket/data',2)
WITH(
task varchar(200) 'var[@dimension="task"]/string',
startdate varchar(200) 'var[@dimension="startdate"]/string'
)
EXEC sp_xml_removedocument @hDocoutputs
task startdate
------- ------------
Task 1 2020-11-14
Task 2 2020-11-15Code Snippets
declare @xmldata xml
set @xmldata =
'<?xml version="1.0"?>
<wddxPacket version="1.0">
<data>
<var dimension="task"><string>Task 1</string></var>
<var dimension="startdate"><string>2020-11-14</string></var>
</data>
<data>
<var dimension="startdate"><string>2020-11-15</string></var>
<var dimension="task"><string>Task 2</string></var>
</data>
</wddxPacket>'
DECLARE @hDoc int
EXEC sp_xml_preparedocument @hDoc OUTPUT, @xmldata
SELECT *
FROM OPENXML(@hDoc, '/wddxPacket/data',2)
WITH(
task varchar(200) 'var[@dimension="task"]/string',
startdate varchar(200) 'var[@dimension="startdate"]/string'
)
EXEC sp_xml_removedocument @hDoctask startdate
------- ------------
Task 1 2020-11-14
Task 2 2020-11-15Context
StackExchange Database Administrators Q#279695, answer score: 8
Revisions (0)
No revisions yet.