3

当您从 XML 和节点中删除<data>包装器时,此代码工作正常,但是当您添加它时,如下所示,我得到 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>当父包装器存在时,有谁知道我如何或为什么在第一个示例中没有得到结果?

4

1 回答 1

6

该问题与围绕您的 XML 数据的“包装器”的数量无关。问题是:您的第一个示例在节点上定义了一个XML 命名空间( xmlns="test.xsd") <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 命名空间声明,您的查询将正常工作 - 两个或更多包装器根本无关紧要。

于 2012-04-29T20:24:38.843 回答