我需要使用xml构建一个表。
这是我的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
任何人都可以帮助我吗?
答案 0 :(得分: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'
)
答案 1 :(得分:3)
首先将@Param
声明为XML类型,并在nodes
和value
中使用XPath表达式,您将得到:
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);
有了预期的结果。
稍微好一点的版本(来自@Shnugo的输入),直接选择/root/ID
而不是XPath表达式中的向后导航:
SELECT
Child=n.v.value('.[1]','NVARCHAR(128)'),
ID=@Param.value('(/root/ID/text())[1]','INT')
FROM
@Param.nodes('root/Child') AS n(v);