如何使用FOR XML PATH嵌套返回XML的存储过程?

如何使用FOR XML PATH嵌套返回XML的存储过程?,xml,sql-server-2008,for-xml-path,Xml,Sql Server 2008,For Xml Path,我有一个FOR XML PATH存储过程,它以通常的方式返回一些XML(为了清晰起见缩短): 我还有另一个存储过程,我希望将上述查询的结果包含在其中,例如 CREATE PROCEDURE sp_returnmainxml AS BEGIN SELECT node.nodeid "@nodeid" ,node.nodedata "data" ,[AT THIS POINT I WOULD LIKE TO CALL sp_returnsubnode AND NEST

我有一个FOR XML PATH存储过程,它以通常的方式返回一些XML(为了清晰起见缩短):

我还有另一个存储过程,我希望将上述查询的结果包含在其中,例如

CREATE PROCEDURE sp_returnmainxml
AS
BEGIN
SELECT  node.nodeid "@nodeid"
       ,node.nodedata "data"
       ,[AT THIS POINT I WOULD LIKE TO CALL sp_returnsubnode AND NEST IT]
       ,node.moredata "moredata"
FROM node
FOR XML PATH ('node')
END
但我尝试过的方法,如将执行sp_子节点的结果分配给xml数据类型,并尝试嵌套,都失败了


这似乎是人们经常想做的事情,但我还没有找到任何关于如何做的参考资料。甚至可能吗?

您可以使用返回XML的用户定义函数来实现这一点

返回XML的函数:

create function getsubnode(@P int)
returns xml as
begin
  return (
          select @P as '@subnodeid',
                 'SubNodData' as somedata
          for xml path('subnode'), type
         ) 
end
这样使用:

select nodeid as '@nodeid',
       nodedata as data,
       dbo.getsubnode(nodeid),
       moredata
from node
for xml path('node')

这当然是一个解决办法,但我不确定它是否理想。这基本上意味着,对于您想要的每个单独的SP,您必须将其与一个uf进行合作,该uf将承担繁重的工作,以防您以后想要嵌套输出。看起来很乱。但如果没有更好的建议,我会考虑的。
select nodeid as '@nodeid',
       nodedata as data,
       dbo.getsubnode(nodeid),
       moredata
from node
for xml path('node')