#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>