Измельчение XML при использовании OpenXML - PullRequest
1 голос
/ 17 марта 2020

Я пытаюсь уничтожить следующее XML, но я не могу получить никаких результатов, используя конструкцию OPEN 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>a1332</c>
      <d>text.</d>
      <e>Risk 2</e>
      <f> </f>
      <g>a123</g>
      <h>1223324aaa</h>
      <i>l1245</i>
      <j>Complete</j>
      <k>Not yet reported</k>    </result>

Обратите внимание на следующий фрагмент кода, который я использую

  DECLARE @xml XML;
DECLARE @idoc INT;
SELECT @xml  = CONVERT(XML, cast(results AS VARCHAR(MAX)), 2) FROM stg.requirements;

EXEC sys.sp_xml_preparedocument @idoc OUTPUT
                               ,@xml
                               ,'<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"/>';

SELECT *
FROM
    OPENXML(@idoc, '/*', 1)
    WITH ()

EXEC sys.sp_xml_removedocument @idoc;    

--SELECT * FROM #temp

DROP TABLE IF EXISTS #temp

1 Ответ

0 голосов
/ 17 марта 2020

Несколько моментов, на которые стоит обратить внимание.

(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 |
+----+----+------------+--------------+
...