Openxmls в SQL Server - детализация в предложении WITH - PullRequest
0 голосов
/ 24 января 2020

У меня есть XML как

<root sxfversion="1.6" gendate="2020-01-23 16:16:40">
<products>
    <p>
      <id>8244</id>
      <name>
        NAME OF ARTICLE
      </name>
      <reference>622801</reference>
      <ean13>3232870162282</ean13>
      <stock>17</stock>
      <price>
        <tax>23</tax>
        <netto>9.2</netto>
        <brutto>11.32</brutto>
      </price>
     </p>
   </products>
</root> 

Я пытаюсь сделать запрос, например:

SELECT 
    *
FROM
    OPENXML(@int, '/root/products/p', 2)
        WITH 
            (id int,
             name varchar(40),
             ean13 varchar(20)
            )

, и это работает.

enter image description here

Теперь я хочу использовать другой (вложенный) столбец - цена (налог, нетто, брутто).

Я могу это сделать с такой модификацией запроса (сверление вверх ), и это также работает:

SELECT 
    *
FROM
OPENXML(@int, '/root/products/p/price', 2)
WITH
(   
    id int '../id',
    name varchar(40) '../name',
    ean13 varchar(20) '../ean13',
    netto varchar(10),
    brutto varchar(10),
    tax varchar(10)
)

НО, почему что-то подобное (сверление вниз не работает должным образом? Это дублирует значение цены каждой строки на все строки.

Можно сверлить вниз ?

SELECT *
FROM OPENXML(@int, '/root/products/p', 2)
WITH ( id varchar(10), 
name varchar(40), 
ean13 varchar(20),
netto varchar(10) '../p/price/netto', 
brutto varchar(10) '//price/brutto', 
tax varchar(10) '//price/tax')

enter image description here

1 Ответ

1 голос
/ 24 января 2020

Можно ли сверлить?

Да. Только не сверлите вверх сначала. .. сверлит вверх на один уровень и / начинается с root. Для навигации относительно текущего узла используйте ..

EG

declare @doc nvarchar(max) = '
<root sxfversion="1.6" gendate="2020-01-23 16:16:40">
<products>
    <p>
      <id>8244</id>
      <name>
                        NAME OF ARTICLE
                    </name>
      <reference>622801</reference>
      <ean13>3232870162282</ean13>
      <stock>17</stock>
      <price>
        <tax>23</tax>
        <netto>9.2</netto>
        <brutto>11.32</brutto>
      </price>
    </p>
        <p>
      <id>8245</id>
      <name>
                        NAME OF ARTICLE2
                    </name>
      <reference>622801</reference>
      <ean13>3232870162282</ean13>
      <stock>17</stock>
      <price>
        <tax>43</tax>
        <netto>1.2</netto>
        <brutto>31.32</brutto>
      </price>
    </p>
</products>
</root>'

declare @hDoc int
EXEC sp_xml_preparedocument @hDoc OUTPUT, @doc;  

SELECT *
FROM OPENXML(@hDoc, '/root/products/p', 2)
WITH ( 
    id varchar(10), 
    name varchar(40), 
    ean13 varchar(20),
    netto varchar(10) './price/netto', 
    brutto varchar(10) './price/brutto', 
    tax varchar(10) './price/tax'
)

EXEC sp_xml_removedocument @hDoc;  

output

id         name                                     ean13                netto      brutto     tax
---------- ---------------------------------------- -------------------- ---------- ---------- ----------
8244       NAME OF ARTICLE                          3232870162282        9.2        11.32      23
8245       NAME OF ARTICLE2                         3232870162282        1.2        31.32      43

(2 rows affected)
...