xml到tsql select语句只返回一行

时间:2017-10-23 10:51:15

标签: sql sql-server xml tsql

我需要使用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

任何人都可以帮助我吗?

2 个答案:

答案 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类型,并在nodesvalue中使用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);