Экспорт SQL с использованием явного XML, создание элементов из под / другого запроса - PullRequest
1 голос
/ 08 января 2011

У меня есть таблица учетных записей и таблица кампаний, с каждой учетной записью связано определенное количество кампаний.Нет, я хочу экспортировать идентификаторы учетной записи и все идентификаторы кампании, связанные с этим идентификатором учетной записи, в XML в этой структуре

<Accounts>
            <Account>
                        <AccountID></AccountID>
                        <AccountName></AccountName>
                        <CampaignIDs>
                                    <CampaignID></CampaignID>
                                    <CampaignID></CampaignID>
                        </CampaignIDs>
            </Account>
</Accounts>

Я использую явное XML для управления выводом данных в XML,что у меня так далеко

SELECT
    1 AS Tag,
    NULL AS Parent,
    NULL AS 'Accounts!1',
    NULL AS 'Account!2!AccountID!Element',
    NULL AS 'Account!2!AccountName!Element',
    NULL AS 'Account!2!FMID!Element'
    UNION ALL
 SELECT
 2 AS Tag,
 1 AS Parent, 
 NULL,
 a.id as AccountID,
 a.Name as AccountName,
 NULL
 from Account a
FOR XML EXPLICIT

Теперь я хочу выполнить еще один запрос, например Select id from campaign where accountid = var, а затем добавить все эти идентификаторы кампании в структуру xml.

Как мне поступить?

1 Ответ

4 голосов
/ 08 января 2011

Я бы порекомендовал использовать FOR XML PATH вместо FOR XML EXPLICIT - это намного проще в использовании и намного более выразительно.

Смотрите это:

-- set up test data
declare @Accounts table (AccountID INT, AccountName VARCHAR(50))
declare @Campaigns table (CampaignID INT, AccountID INT, CampaignName varchar(50))

insert into @Accounts values(1, 'Account #1'),(2, 'Account #2')
insert into @Campaigns values(1, 1, 'Campaign #1-1'), (2, 1, 'Campaign #2-1'), (3, 1, 'Campaign #3-1'),
(4, 2, 'Campaign #1-2'), (5, 2, 'Campaign #2-2')

-- SELECT with FOR XML PATH and a nested SELECT/FOR XML PATH,TYPE    
select 
    AccountID,
    AccountName,
    (SELECT CampaignID  
     FROM @Campaigns c
     WHERE c.AccountID = a.AccountID
     FOR XML PATH(''),TYPE) AS 'CampaignIDs'
FROM 
    @Accounts a
FOR XML PATH('Account'),ROOT('Accounts')

Этот оператор SELECT дает мне следующий вывод:

<Accounts>
  <Account>
    <AccountID>1</AccountID>
    <AccountName>Account #1</AccountName>
    <CampaignIDs>
      <CampaignID>1</CampaignID>
      <CampaignID>2</CampaignID>
      <CampaignID>3</CampaignID>
    </CampaignIDs>
  </Account>
  <Account>
    <AccountID>2</AccountID>
    <AccountName>Account #2</AccountName>
    <CampaignIDs>
      <CampaignID>4</CampaignID>
      <CampaignID>5</CampaignID>
    </CampaignIDs>
  </Account>
</Accounts>
...