Как я могу вкладывать хранимые процедуры, которые возвращают XML, используя FOR XML PATH? - PullRequest
1 голос
/ 01 февраля 2012

У меня есть хранимая процедура FOR XML PATH, которая возвращает XML в обычном порядке (сокращенно для ясности):

CREATE PROCEDURE sp_returnsubnode
AS
BEGIN
SELECT  subnode.subnodeid "@subnodeid"
       ,subnode.somedata "somedata"
FROM subnode
FOR XML PATH('subnode')
END

У меня есть другая хранимая процедура, в которую я хотел бы включить результаты вышеупомянутогозапрос, например,

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_subnode типу данных xml и пытаться вложить неудачные данные.

Это похоже на то, что люди хотели быделать часто, но я не нашел никаких ссылок на то, как это сделатьЭто вообще возможно?

1 Ответ

2 голосов
/ 01 февраля 2012

Вы можете сделать это с помощью пользовательских функций, возвращающих 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')
...