2016-04-06 6 views
2

複数のxmlファイルを解析しようとしています。 しかしsql xmlを正しく解析する際にaplly "cross apply"する方法

まずバリアントは正常に動作します適用

DECLARE @input XML = 

'<a> 
    <b> 
    <g>one</g> 
    <n> 
     <c>somedata1 1</c> 
    </n> 
    <n> 
     <c>2somedata 2</c> 
    </n> 
</b> 
</a>'  

SELECT 
g     = XC.value('(g)[1]', 'varchar(100)'), 
i     = xc1.n1.value ('(c)[1]', 'varchar(100)') 
FROM @input.nodes ('a/b') as XT (XC) 
cross apply @input.nodes ('//n') as xc1(n1) 

第二の変形は、(空のフィールドを返す)失敗したクロスを適用する際にスタック - 私は、これは<с>ノード

DECLARE @input XML = 
'<a> 
    <b> 
    <g>one</g> 
     </b> 
</a>' 
SELECT 
    g     = XC.value('(g)[1]', 'varchar(100)'), 
    i     = xc1.n1.value ('(c)[1]', 'varchar(100)') 
FROM @input.nodes ('a/b') as XT (XC) 
cross apply @input.nodes ('//n') as xc1(n1) 

の不在becouse Iである知っています複数のファイルを扱い、それらのノードの中にはいくつかのものがありますが、私の決定はどういうものでしょうか?

答えて

2

2番目のケースでは、n要素がありません。 OUTER APPLYを使用する必要があります。

CROSS APPLYとOUTER APPLYの2つの形式があります。 CROSS APPLY は、テーブルセットの関数 の結果セットを生成する外部テーブルの行のみを返します。 OUTER APPLYは、テーブル値関数によって生成された列 にNULL値を持つ結果セットを生成する行と、そうでない行の両方を返す両方の行を返します。

DECLARE @input XML = 
'<a> 
    <b> 
    <g>one</g> 
     </b> 
</a>'; 

SELECT g = XC.value('(g)[1]', 'varchar(100)'), 
     i = xc1.n1.value ('(c)[1]', 'varchar(100)') 
FROM @input.nodes ('a/b') AS XT (XC) 
OUTER APPLY @input.nodes ('//n') AS xc1(n1); 

LiveDemo

出力:

╔═════╦══════╗ 
║ g ║ i ║ 
╠═════╬══════╣ 
║ one ║ NULL ║ 
╚═════╩══════╝ 
+1

ありがとうございます!よく働く –

関連する問題