1

問題の簡略版を作成しました。

DECLARE @X XML = 
'<Root xmlns="TestNS" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
    <Test>
        <Id>1</Id>
        <InnerCollection>
            <InnerItem>
                <Value>1</Value>
            </InnerItem>
            <InnerItem>
                <Value>2</Value>
            </InnerItem>
            <InnerItem>
                <Value>3</Value>
            </InnerItem>
        </InnerCollection>
    </Test>
    <Test>
        <Id>2</Id>
        <InnerCollection>
            <InnerItem>
                <Value>5</Value>
            </InnerItem>
            <InnerItem>
                <Value>6</Value>
            </InnerItem>
            <InnerItem>
                <Value>7</Value>
            </InnerItem>
        </InnerCollection>
    </Test>
</Root>'

<Test>各要素を取得して行に分割するクエリを作成しようとしています。各行で、Id と InnerCollection を XML として選択します。最初の行 (Id:1) にこの InnerCollection XML を作成したいと思います。

<InnerCollection xmlns="Reed.Api" xmlnsi="http//www.w3.org/2001/XMLSchema-instance">
  <InnerItem>
    <Value>1</Value>
  </InnerItem>
  <InnerItem>
    <Value>2</Value>
  </InnerItem>
  <InnerItem>
    <Value>3</Value>
  </InnerItem>
</InnerCollection>

このクエリでそれを試してみましたが、要素に不要な名前空間を配置します:

;WITH XMLNAMESPACES
(
    DEFAULT 'TestNS'
    , 'http://www.w3.org/2001/XMLSchema-instance' AS i
)
SELECT 
    X.value('Id[1]', 'INT') Id
    -- Creates a p1 namespace that I don't want.
    , X.query('InnerCollection') InnerCollection
FROM @X.nodes('//Test') AS T(X)

今日の私の Google-fu はあまり強力ではありませんが、くそったれの関数が query と呼ばれるのが簡単になるわけではないと思います。クエリ メソッド以外の XML 値を作成するために、他のメソッドを使用することにオープンです。

この方法を使用できます:

;WITH XMLNAMESPACES
(
    DEFAULT 'TestNS'
    , 'http://www.w3.org/2001/XMLSchema-instance' AS i
)
SELECT 
    X.value('Id[1]', 'INT') Id
    ,CAST(
        (SELECT 
            InnerNodes.Node.value('Value[1]', 'INT') AS 'Value'
        FROM X.nodes('./InnerCollection[1]//InnerItem') AS InnerNodes(Node) 
        FOR XML PATH('InnerItem'), ROOT('InnerCollection')
        ) AS XML) AS InnerCollection
FROM @X.nodes('//Test') AS T(X)

しかし、それにはノードを呼び出して選択可能なものに分割し、FOR XML を使用してそれを XML に戻す必要があります...そもそも XML だったのに。これは非効率な方法のように思えるので、ここにいる誰かがより良いアイデアを持っていることを願っています.

4

1 に答える 1

1

これは、 query メソッドを使用して SELECT を実行し、質問が探していた各行に XML を作成する方法です。

;WITH XMLNAMESPACES
(
    'http://www.w3.org/2001/XMLSchema-instance' AS i
    , DEFAULT 'TestNS'
)
SELECT
    Test.Row.value('Id[1]', 'INT') Id
    , Test.Row.query('<InnerCollection xmlns="TestNS" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">{InnerCollection}</InnerCollection>')
FROM @X.nodes('/Root/Test') AS Test(Row)
于 2012-07-19T21:33:34.657 に答える