2017-10-23 4 views
1

xmlを使用してテーブルを構築する必要があります。xmlからtsqlへのselect文は1行だけを返します

これは私のxmlです:

<root> 
    <Child>c1</Child> 
    <Child>c2</Child> 
    <Child>c3</Child> 
    <Child>c4</Child> 
    <ID>9908</ID> 
</root> 

私の試み:

DECLARE @ixml INT, 
@Param VARCHAR(max)='<root> 
    <Child>c1</Child> 
    <Child>c2</Child> 
    <Child>c3</Child> 
    <Child>c4</Child> 
    <ID>9908</ID> 
</root>' 


EXEC sp_xml_preparedocument @ixml OUTPUT, @Param 

    Select Child,ID 
    FROM OPENXML(@ixml, 'root') 
    WITH 
    (
     Child [nVARCHAR](max) 'Child', 
     ID [INT] 'ID' 
    ) 


---------- 

実際の出力:

Child | ID 
c1  | 9908 

予想される出力:

Child | ID 
c1  | 9908 
c2  | 9908 
c3  | 9908 
c4  | 9908 

誰でも私を助けることができますか? XMLタイプとして@Paramを宣言し、nodesvalueでXPath式を使用して以降では

+0

Iだろう'Child'要素を選択して、その権利を持った後に' ID'を追加することをお勧めします – MartinByers

+0

'FROM OPENXML'から対応するSPを準備するドキュメントを削除するには、古いものであり、これ以上使用しないでください。むしろ適切な[XMLデータ型が提供するメソッド](https://msdn.microsoft.com/en-us/library/ms190798.aspx)を使用してください。 – Shnugo

答えて

3

、あなたが得るでしょう:

DECLARE @Param XML='<root> 
    <Child>c1</Child> 
    <Child>c2</Child> 
    <Child>c3</Child> 
    <Child>c4</Child> 
    <ID>9908</ID> 
</root>' 

SELECT 
    Child=n.v.value('.[1]','NVARCHAR(128)'), 
    ID=n.v.value('../ID[1]','INT') 
FROM 
    @Param.nodes('root/Child') AS n(v); 

予想される結果で。


A(@Shnugoからの入力に)わずかに良いバージョン、代わりにXPath式で後方ナビゲーションの/root/IDを直接選択して:

SELECT 
    Child=n.v.value('.[1]','NVARCHAR(128)'), 
    [email protected]('(/root/ID/text())[1]','INT') 
FROM 
    @Param.nodes('root/Child') AS n(v); 
+0

ありがとうございます。その作業 –

+2

良い答えは、それをplused ...パフォーマンスのために、後方のナビゲーションはドローバックであり、 'text()'の取得は単純な 'ID [1]' 。私は 'SELECT [email protected]( '/ root/ID/text())[1]'、 'int')、Child = nvvalue( 'text()[1]'、 'nvarchar (128) ')FROM ... ' – Shnugo

+0

@ Shnugoヒントをありがとう、私の答えでそれを働いた。 –

4

これを試してみてください:

DECLARE @ixml INT, 
@Param VARCHAR(max)='<root> 
    <Child>c1</Child> 
    <Child>c2</Child> 
    <Child>c3</Child> 
    <Child>c4</Child> 
    <ID>9908</ID> 
</root>' 


EXEC sp_xml_preparedocument @ixml OUTPUT, @Param 

Select Child, ID 
FROM OPENXML(@ixml, '/root/Child') 
WITH 
(
    Child [nVARCHAR](max) '.', ID [int] '../ID' 
) 
+0

ありがとうございます。その作業 –

+1

素晴らしいです。ただし、終了したらxml参照を削除する必要があることを覚えておいてください(exec sp_xml_removedocument @ixml;) – Tyron78

+0

これらのストアドプロシージャを使用する煩雑な方法(ドキュメントを閉じることなどを忘れる可能性を含む)があるため、私の答えに概説されているように、これらの問題を解決し、代わりにXMLで作業する新しい方法を使用してください。 –

関連する問題