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 名前空間宣言がなければ、クエリは問題なく動作します.2 つ以上のラッパーはまったく問題ではありません..

于 2012-04-29T20:24:38.843 に答える