2015-12-28 3 views
0

I have these two tables that I wish to create a nested XML schema out ofBiztalk: Вложенные Плоский Файл схемы

Я хочу, чтобы схема выглядеть примерно так:

<PERSON ID="1" FN="F1" LN="L1"> 
    <DETAIL ID="1" NUM="11"/> 
    <DETAIL ID="1" NUM="12"/> 
</PERSON> 
<PERSON ID="2" FN="F2" LN="L2"> 
    <DETAIL ID="1" NUM="21"/> 
    <DETAIL ID="1" NUM="22"/> 
    <DETAIL ID="1" NUM="23"/> 
</PERSON> 

я называю некоторые SQL, чтобы получить данные из таблиц. Один из способов, с помощью которого я попытался использовать внутреннее соединение в поле «ИД», а другой способ использует хранимую процедуру для возврата двух наборов данных, по одному для каждой таблицы. Проблема, с которой я сталкиваюсь в обоих направлениях, - как мне сопоставить ее с вышеуказанной структурой?

В конце концов я получаю одну запись DETAIL за запись ПЕРСОНА (ПЕРСОНА) или я получаю все записи DETAIL за запись PERSON (ID больше не совпадает).

+0

Что сделал SQL выглядеть, когда вы пытались использовать внутреннее соединение? Кроме того, я предполагаю, что атрибуты ID должны быть ID = «2» в элементе PERSON с ID = «2»? – Gruff

ответ

0

Если вы попробуете это SQL:

SELECT 
ID AS '@ID', 
FN AS '@FN', 
LN AS '@LN', 
(
SELECT ID AS '@ID', NUM AS '@NUM' FROM Table_2 WHERE table_2.ID = dbo.Table_1.ID FOR XML PATH('DETAIL') ,TYPE 
) AS 'details' 
FROM dbo.Table_1 
FOR XML PATH('PERSON') 

вы получите некоторое содержание XML, как показано ниже:

<PERSON ID="1" FN="F1" LN="L1"> 
    <details> 
    <DETAIL ID="1" NUM="11" /> 
    <DETAIL ID="1" NUM="12" /> 
    </details> 
</PERSON> 
<PERSON ID="2" FN="F2" LN="L2"> 
    <details> 
    <DETAIL ID="2" NUM="21" /> 
    <DETAIL ID="2" NUM="22" /> 
    <DETAIL ID="2" NUM="23" /> 
    </details> 
</PERSON> 
+0

Оставив псевдоним 'AS 'details' ', он будет выглядеть как структура примера в вопросе. – Gruff

1

Использование FOR XML AUTO:

SELECT PERSON.ID, PERSON.FN, PERSON.LN, DETAIL.ID, DETAIL.NUM 
FROM PERSON 
JOIN DETAIL ON PERSON.ID = DETAIL.ID 
FOR XML AUTO 

Использование FOR XML PATH:

SELECT p.ID '@ID', p.FN '@FN', p.LN '@LN', 
    (
     SELECT d.ID '@ID', d.NUM '@NUM' 
     FROM DETAIL d 
     WHERE p.ID = d.ID 
     FOR XML PATH('DETAIL'), TYPE 
    ) 
FROM PERSON p 
FOR XML PATH('PERSON') 

и будет производить это:

<PERSON ID="1" FN="F1" LN="L1"> 
    <DETAIL ID="1" NUM="11" /> 
    <DETAIL ID="1" NUM="12" /> 
</PERSON> 
<PERSON ID="2" FN="F2" LN="L2"> 
    <DETAIL ID="2" NUM="21" /> 
    <DETAIL ID="2" NUM="22" /> 
    <DETAIL ID="2" NUM="23" /> 
</PERSON> 
+0

Поэтому я использую DB2. Поэтому я обновил SQL для возврата XML CLOB. Два ряда, по одному для каждого ЧЕЛОВЕКА и каждый с соответствующим количеством элементов DETAIL. Но теперь результат BizTalk считывает котировки как ",

+0

'ВЫБОРА XML2CLOB ( XMLELEMENT (ИМЯ "Person", XMLATTRIBUTES (ID, имя, фамилия), XMLAgg ( XmlElement (название "Деталь", XMLATTRIBUTES (ID, ДНО)) ORDER BY NUM) )) ОТ ЛИЦА INNER JOIN ДЕТАЛЬ \t нА PERSON.ID = DETAIL.ID \t GROUP BY PERSON.ID, имя, фамилия, ' –

+0

@MohammadZeni Если у вас есть дополнительные детали на вопрос с помощью кнопки редактирования, чтобы изменить свой вопрос, а не делая это в комментариях. Если это новый вопрос, задайте новый вопрос и добавьте ссылку на него, если он относится к новому. – Dijkgraaf

Смежные вопросы