как преобразовать результат хранимой процедуры в xml и использовать его в качестве вспомогательного узла в другом результате процесса

#sql-server #xml

#sql-server #xml

Вопрос:

У меня есть хранимая процедура с именем as

 usp_Employee_GetInfo
  

этот процесс возвращает таблицу после выполнения.
как показано ниже:

 Id Name DeptID
1  AAA  10
  

Я хочу создать новую процедуру, которая возвращает xml после выполнения.
И он включает в себя приведенный выше результат процесса как один вспомогательный узел, как показано ниже:

 <company Name="XXX">
 <Emp>
   <Id>1</Id>
   <Name>AAA</Name>
   <DeptID>10</DeptID>
 </Emp>
</company>
<company Name="YYY">
 <Emp>
   <Id>2</Id>
   <Name>BBB</Name>
   <DeptID>20</DeptID>
 </Emp>
</company>
  

Можете ли вы, ребята, предложить наилучший способ использования существующего процесса для получения требуемого результата.
Спасибо.

Комментарии:

1. Есть ли причина использовать хранимую процедуру ? Если этот SP просто читает и возвращает таблицу, это было бы намного лучше сделать как встроенный TVF . В этом случае было легко написать что-то вроде SELECT * FROM dbo.MyFunction() FOR XML AUTO .

2. На самом деле данные, о которых я упоминал выше, являются фиктивными данными. И исходные данные, которые возвращаются из процесса, взяты из нескольких таблиц, и существует множество сценариев.

Ответ №1:

Вы можете объявить табличную переменную. Поместите результаты SP в эту таблицу и создайте нужный вам XML:

 DECLARE @emp TABLE (
    Id int,
    [Name] nvarchar(max),
    DeptID int,
    company nvarchar(max)
)

INSERT INTO @emp 
EXEC usp_Employee_GetInfo

--F.e. output of SP is:
--Id    Name    DeptID  company
--1     AAA     10      XXX
--2     BBB     20      YYY 

SELECT  company as 'company/@name',
        emp.Id as 'Emp/id',
        emp.[Name] as 'Emp/Name',
        emp.DeptID as 'Emp/DeptID'
FROM @emp
FOR XML PATH('')
  

Выведет:

 <company name="XXX" />
<Emp>
  <id>1</id>
  <Name>AAA</Name>
  <DeptID>10</DeptID>
</Emp>
<company name="YYY" />
<Emp>
  <id>2</id>
  <Name>BBB</Name>
  <DeptID>20</DeptID>
</Emp>