В общем, я бы предложил использовать FOR XML PATH()
. Этот режим обеспечивает максимальный контроль над тем, как будет выглядеть XML. Режим AUTO
- по крайней мере, для - волхвов c: -)
Но вы можете попробовать это:
Создать макет для имитации вашего сценария (Пожалуйста, сделайте это самостоятельно в следующем вопросе):
DECLARE @t1 TABLE(ID1 INT IDENTITY,SomeValue VARCHAR(100));
INSERT INTO @t1 VALUES('test1'),('test2');
DECLARE @t2 TABLE(ID2 INT IDENTITY,linkT1 INT,SomeValue VARCHAR(100));
INSERT INTO @t2 VALUES(1,'test1.2.1'),(1,'test1.2.2'),(2,'test2.2.1');
DECLARE @t3 TABLE(ID3 INT IDENTITY,linkT1 INT,SomeValue VARCHAR(100));
INSERT INTO @t3 VALUES(1,'test1.3.1'),(1,'test1.3.2'),(2,'test2.3.1');
- Ваш запрос слегка изменен на коррелированные подзапросы :
DECLARE @xmlDoc xml
SET @xmlDoc = (
SELECT v1.*
,(SELECT * FROM @t2 AS vs2 WHERE vs2.linkT1=v1.ID1 FOR XML AUTO,TYPE)
,(SELECT * FROM @t3 AS vs3 WHERE vs3.linkT1=v1.ID1 FOR XML AUTO,TYPE)
FROM @t1 AS v1
FOR XML AUTO)
SELECT @xmlDoc;
Результат
<v1 ID1="1" SomeValue="test1">
<vs2 ID2="1" linkT1="1" SomeValue="test1.2.1" />
<vs2 ID2="2" linkT1="1" SomeValue="test1.2.2" />
<vs3 ID3="1" linkT1="1" SomeValue="test1.3.1" />
<vs3 ID3="2" linkT1="1" SomeValue="test1.3.2" />
</v1>
<v1 ID1="2" SomeValue="test2">
<vs2 ID2="3" linkT1="2" SomeValue="test2.2.1" />
<vs3 ID3="3" linkT1="2" SomeValue="test2.3.1" />
</v1>