SQL 服务器中的 Openxmls - 在 WITH 子句中向下钻取
Openxmls in SQL Server - drilling down in WITH clause
我有一个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)
)
并且有效。
现在我想使用另一个(嵌套的)列 - 价格(税、netto、brutto)。
我可以像这样修改查询(钻取 up),它也有效:
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')
Is possible to drill down?
是的。只是不要先钻 up。 ..
向上钻取一级,/
从根开始。要相对于当前节点导航,请使用 .
.
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;
产出
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)
我有一个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)
)
并且有效。
现在我想使用另一个(嵌套的)列 - 价格(税、netto、brutto)。
我可以像这样修改查询(钻取 up),它也有效:
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')
Is possible to drill down?
是的。只是不要先钻 up。 ..
向上钻取一级,/
从根开始。要相对于当前节点导航,请使用 .
.
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;
产出
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)