i have xml text, and want extract data
DECLARE @d_txt VARCHAR(max)
SET @d_txt = '
<DI_List>
<SDI>
<a>6559864</a>
<DI>
<Id>3036780478</Id>
<mic>
<date>2022-11-13</date>
<kod>774673</kod>
</mic>
<mic>
<date>2022-11-11</date>
<kod>774673</kod>
</mic>
</DI>
</SDI>
</DI_List>'
DECLARE @d_xml INT
exec sp_xml_preparedocument @d_xml output, @d_txt;
SELECT *
FROM OPENXML(@d_xml, '/DI_List/SDI', 0) WITH
(
Id VARCHAR(30) 'DI/Id',
nmic XML 'DI/mic'
)
EXEC sys.sp_xml_removedocument @d_xml
i got
| Id | nmic |
|---|---|
| 3036780478 | <mic><date>2022-11-13</date><kod>774673</kod></mic> |
but i want nmic field contains both nodes, not first only
| Id | nmic |
|---|---|
| 3036780478 | <mic><date>2022-11-13</date><kod>774673</kod></mic><mic><date>2022-11-11</date><kod>774673</kod></mic> |
can i doit with SQL Server OPENXML?
CodePudding user response:
As mentioned in the comments, use XQuery instead of OPENXML; OPENXML is a far older and "clunky" way of querying XML. Also, your XML is in the wrong datatype, there is an xml data type for XML.
If you switch to XQuery, and change the data type, this is much easier:
DECLARE @d_txt xml --varchar is the wrong datatype
SET @d_txt = '
<DI_List>
<SDI>
<a>6559864</a>
<DI>
<Id>3036780478</Id>
<mic>
<date>2022-11-13</date>
<kod>774673</kod>
</mic>
<mic>
<date>2022-11-11</date>
<kod>774673</kod>
</mic>
</DI>
</SDI>
</DI_List>';
SELECT SDI.DI.value('(Id/text())[1]', 'bigint') AS Id,
SDI.DI.query('mic') AS nmic
FROM @d_txt.nodes('DI_List/SDI/DI')SDI(DI);
