当您删除 <data>
时,这段代码工作正常包装器,来自 XML 和节点,但是当您添加它时,如下所示,我得到 0 个结果。
-- Declare XML variable
DECLARE @data XML;
-- Element-centered XML
SET @data =
N'
<data xmlns="test.xsd">
<subdata>
<customer>
<id>1</id>
<name>Allied Industries</name>
</customer>
<customer>
<id>2</id>
<name>Trades International</name>
</customer>
</subdata>
</data>';
-- Using the query() method
SELECT T.customer.query('id').value('.', 'INT') AS customer_id,
T.customer.query('name').value('.', 'VARCHAR(20)') AS customer_name
FROM @data.nodes('data/subdata/customer') AS T(customer);
但是当我这样做时效果很好:
-- Element-centered XML
SET @data =
N'
<subdata>
<customer>
<id>1</id>
<name>Allied Industries</name>
</customer>
<customer>
<id>2</id>
<name>Trades International</name>
</customer>
</subdata>
';
-- Using the query() method
SELECT T.customer.query('id').value('.', 'INT') AS customer_id,
T.customer.query('name').value('.', 'VARCHAR(20)') AS customer_name
FROM @data.nodes('subdata/customer') AS T(customer);
有谁知道我在第一个示例中如何或为什么没有得到结果,当 <data>
父包装器在吗?
最佳答案
问题与 XML 数据周围的“包装器”数量无关。问题是:您的第一个示例在 xmlns="test.xsd"
上定义了一个 XML 命名空间 ( <data>
)节点,但您的查询没有考虑到这一点。
您需要将查询更改为如下所示:
-- Using the query() method
;WITH XMLNAMESPACES (DEFAULT 'test.xsd')
SELECT
T.customer.query('id').value('.', 'INT') AS customer_id,
T.customer.query('name').value('.', 'VARCHAR(20)') AS customer_name
FROM
@data.nodes('data/subdata/customer') AS T(customer);
然后你会得到结果......
如果没有这个 XML 命名空间声明,您的查询将正常工作 - 两个包装器或更多包装器根本无关紧要..
关于xml - 当 XML 有 2 个包装器时无法读取内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10375609/