xml to tsql select语句只返回一行

xml to tsql select语句只返回一行,sql,sql-server,xml,tsql,Sql,Sql Server,Xml,Tsql,我需要使用xml构建一个表 这是我的xml: <root> <Child>c1</Child> <Child>c2</Child> <Child>c3</Child> <Child>c4</Child> <ID>9908</ID> </root> 预期产出: Child | ID c1 | 9908 c2

我需要使用xml构建一个表

这是我的xml:

<root>
  <Child>c1</Child>
  <Child>c2</Child>
  <Child>c3</Child>
  <Child>c4</Child>
  <ID>9908</ID>
</root>
预期产出:

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

有人能帮我吗?

首先将@Param声明为XML类型,然后在和中使用XPath表达式,您将得到:

声明@Param XML='0 c1 c2 c3 补体第四成份 9908 ' 选择 Child=n.v.value'[1]',NVARCHAR128', ID=n.v.value'../ID[1]',INT' 从…起 @参数节点“根/子节点”为nv; 达到了预期的效果

一个稍好一点的版本,输入自,直接选择/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);

首先将@Param声明为XML类型,然后在和中使用XPath表达式,您将得到:

声明@Param XML='0 c1 c2 c3 补体第四成份 9908 ' 选择 Child=n.v.value'[1]',NVARCHAR128', ID=n.v.value'../ID[1]',INT' 从…起 @参数节点“根/子节点”为nv; 达到了预期的效果

一个稍好一点的版本,输入自,直接选择/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);
试试这个:

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'
) 
试试这个:

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

我建议您尝试只选择子元素,然后在从OPENXML获得相应SPs的权限后添加ID,以准备和删除已过时的文档,不应再使用。我建议您尝试只选择子元素,然后在从OPENXML获得相应SP的权限后添加ID,以准备和删除已过时的文档,不应再使用。而是使用合适的。太好了。但是,请记住,在完成exec sp_xml_removedocument@ixml;由于处理这些存储过程的方式很麻烦,包括可能忘记关闭文档等,因此您应该避免使用这些存储过程,而是使用我在回答中概述的处理XML的新方式。太好了。但是,请记住,在完成exec sp_xml_removedocument@ixml;由于处理这些存储过程的方式很麻烦,包括可能忘记关闭文档等,因此您应该避免使用这些存储过程,而是使用我在回答中概述的处理XML的新方式。回答不错,再加上。。。为了提高性能,您可能会记住,向后导航是一种回退,获取文本的速度略快于简单ID[1]。我会使用SELECT ID=@Param.value'/root/ID/text[1]'、'int',Child=n.v.value'text[1]'、'nvarchar128'FROM…@Shnugo谢谢你的提示,在我的答案中使用了它。好答案,加上它。。。为了提高性能,您可能会记住,向后导航是一种回退,获取文本的速度略快于简单ID[1]。我会使用SELECT ID=@Param.value'/root/ID/text[1]'、'int',Child=n.v.value'text[1]'、'nvarchar128'FROM…@Shnugo谢谢你的提示,在我的回答中提到了这一点。