instruction xml to tsql select renvoie une seule ligne

J'ai besoin de build une table en utilisant un xml.

C'est mon xml:

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

Mon essai:

 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' ) ---------- 

Sortie réelle:

 Child | ID c1 | 9908 

Production attendue:

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

Quelqu'un peut-il m'aider?

Essaye ça:

 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' ) 

En commençant par déclarer @Param comme un type XML et en utilisant des expressions XPath dans les nodes et la value , vous obtiendrez:

 DECLARE @Param XML='<root> <Child>c1</Child> <Child>c2</Child> <Child>c3</Child> <Child>c4</Child> <ID>9908</ID> </root>' SELECT Child=nvvalue('.[1]','NVARCHAR(128)'), ID=nvvalue('../ID[1]','INT') FROM @Param.nodes('root/Child') AS n(v); 

Avec le résultat attendu.


Une version légèrement meilleure (avec une input de @Shnugo ), avec une sélection directe de /root/ID au lieu de la navigation vers l'arrière dans l'expression XPath:

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