Я пытаюсь, чтобы SQL Server создал документ XML, используя данные, которые находятся в нескольких таблицах.Например, мои таблицы могут выглядеть так:
TableKey | ParentKey | TableName | Fields
1-1-1-1 | null | Fruit | protein, calories
1-1-1-2 | 1-1-1-1 | Apples | somefield, largeapple, redorgreen
1-1-1-3 | 1-1-1-2 | CanApples | SomeCanAppleField, AnotherField
1-1-1-4 | 1-1-1-1 | Oranges | citric, calories
1-1-1-5 | 1-1-1-1 | Grapes | citric, calories, large
1-1-1-6 | 1-1-1-3 | CranCanApples | verybig
1-1-1-7 | 1-1-1-5 | WildGrapes | somemorefields, large, heavy, huge
Таблица выше является примером типа данных, с которыми мне приходится работать.Поля названы случайным образом, потому что фактический проект не имеет конечного числа полей или таблиц, известных на момент выполнения.
Я могу выполнить любой один запрос и заставить его вернуть XML-представление этой таблицы, дляэкземпляр:
ВЫБЕРИТЕ белок, калории ОТ Фрукты ЗАКАЗАТЬ ПО DateUpdated DESC FOR XML Path ('')
Мне нужна функция, которая рекурсивно создает XML-документ, включая подструктуры, используя ParentKey и ChildKey дляглубина.
Например, мне понадобится следующая строка, которую я могу выполнить, возвращенная из функции:
SELECT protein, calories,(SELECT somefield,largeapple,redorgreen,(SELECT SomeCanAppleField, AnotherField,(SELECT verybig FROM CranCanApples FOR XML AUTO, TYPE, ELEMENTS) FROM CanApples FOR XML AUTO, TYPE, ELEMENTS) FROM Apples FOR XML AUTO, TYPE, ELEMENTS) FROM Fruit FOR XML AUTO, TYPE, ELEMENTS
Я хотел бы иметь скрипт, который использует ParentKeys
и TableKeys
чтобы поместить эти структуры друг в друга в XML, например:
<Fruit>
<protein>123</protein>
<calories>500</calories>
<Apples>
<somefield>true</somefield>
<largeapple>false</largeapple>
<redorgreen>green</redorgreen>
<CanApples>
<SomeCanAppleField>false<SomeCanAppleField>
<AnotherField>false</AnotherField>
<CranCanApples>
<verybig>false</verybig>
</CranCanApples>
</CanApples>
</Apples>
<Oranges>
<citric>true</citric>
<calories>232</calories>
</Oranges>
..... и так далее для каждой дочерней таблицы
Может кто-нибудь объяснить, как выполнять выполнениеэто действие с помощью скрипта?Глубина структуры XML варьируется в зависимости от таблиц по этой теме, то есть "Фрукты", "Животные", "Автомобили", "Компьютеры"
РЕДАКТИРОВАТЬ:
Это то, что я придумалпока, но это не работает из-за EXEC
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO
ALTER FUNCTION [dbo].[GetSubTree](@TableKey varchar(36))
RETURNS XML
BEGIN
DECLARE
@TableFields varchar(max),
@TableName varchar(100),
@TableKey2 varchar(36),
@TableShortName varchar(50),
@test xml
SELECT
@TableFields = 'SELECT '+TableFields,
@TableName=TableName,
@TableKey2=TableKey,
@TableShortName=TableShortName
FROM ListTableFields
WHERE ParentKey=@TableKey
OR (ParentKey ='' AND @TableKey IS NULL)
SET @TableFields = replace(@TableFields,'SELECT ,','SELECT ')
SET @TableName = replace(@TableName,'ReportMain','Report')
SET @TableShortName = replace(@TableShortName,'Main',@TableName)
RETURN (
EXEC(@TableFields+',dbo.GetSubTree('''+@TableKey2+''') FROM '+@TableName +' ORDER BY DateUpdated FOR XML PATH('''+@TableShortName+'''),TYPE')
)
END
Оказывается, я не могу использовать команду EXEC внутри функции, но у меня "должен" быть динамический запрос, так как поля и имена таблиц всегда будутможет отличаться в зависимости от таблицы.
Чтобы инициировать это, я бы использовал:
SELECT dbo.GetSubTree(null)
FOR XML PATH(''),TYPE
Вне функции этот запрос делает то, что мне нужно.