Несколько моментов, на которые стоит обратить внимание.
(1) Ваш XML был неправильно сформирован, поэтому мне пришлось это исправить.
(2) Начиная с SQL Server Начиная с 2005 года он использует язык XQuery, основанный на стандартах w3 c, для работы с типом данных XML. Собственные Microsoft OPENXML
и ее компаньоны sp_xml_preparedocument
и sp_xml_removedocument
сохраняются только для обратной совместимости с устаревшим SQL Server 2000. Вот почему использование пространств имен .nodes()
(3) всегда должно быть
(4) Правильные SQL Типы данных сервера в методе .value()
.
SQL
DECLARE @xml XML = '<?xml version="1.0" encoding="UTF-8"?>
<results xmlns="https://crr.clm.ibmcloud.com/rs/query/1111/dataservice/ns"
xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"
xs:schemaLocation="https://crr.clm.ibmcloud.com/rs/query/1111/dataservice/ns https://crr.clm.ibmcloud.com/rs/query/1111/dataservice/xsd">
<result>
<a>a1</a>
<b>2</b>
<c>2020-02-15</c>
<d>text.</d>
</result>
<result>
<a>a7</a>
<b>25</b>
<c>2020-01-25</c>
<d>Another text</d>
</result>
</results>';
;WITH xmlnamespaces (DEFAULT 'https://crr.clm.ibmcloud.com/rs/query/1111/dataservice/ns')
SELECT c.value('(a/text())[1]', 'VARCHAR(10)') AS a
, c.value('(b/text())[1]', 'INT') AS b
, c.value('(c/text())[1]', 'DATE') AS c
, c.value('(d/text())[1]', 'VARCHAR(30)') AS d
FROM @xml.nodes('/results/result') AS t(c);
Выход
+----+----+------------+--------------+
| a | b | c | d |
+----+----+------------+--------------+
| a1 | 2 | 2020-02-15 | text. |
| a7 | 25 | 2020-01-25 | Another text |
+----+----+------------+--------------+