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