2017-10-11 62 views
0

我的任务是将SQL数据导出到XML。我必须将所有在每个文件上工作的人员与他们的电子邮件地址一起,将他们联合在一起,并为他们分配一个ID。我只是使用行号来设置他们的ID - 它们是否改变并不重要,只要我们上传这个XML文件就必须保持一致。将SQL结果转换为“规范化”XML

对于那些addressid s,我们必须用每个ID替换每个文件中的责任方。

最终的结果会是这个样子:

<Addresses> 
    <Address Name="SomeName" Email= "SomeEmail" Addressid="SomeID"/> 
</Addresses> 
<Files> 
    <File party1id="2" Party2ID="3" Party3ID="6" /> 
</Files> 

我有地址表的工作,但我有困难拉出所有ID为每一方。多次参加该表并不是一个可行的解决方案。

有没有人有更好的方法来解决这个问题?

+0

请提供您的表的样本数据也-HTH)。 –

回答

0

我想你可以使用这样的查询:

;with t as (
    select *, 
     row_number() over (partition by Addressid order by partyId) rn 
    from party 
) 
select (
    select 
     [Name] 'Address/@Name', 
     Email 'Address/@Email', 
     Addressid 'Address/@Addressid' 
    from Addresses 
    for xml path('Addresses')) + 
    '<Files><File ' + replace((
    select 'Party'+cast(rn as varchar(5))+'ID='''+cast(partyId as varchar(5))+''' ' 
    from t 
    where Addresses.Addressid = t.Addressid 
    for xml path('') 
    ),'''', '"') + '/></Files>' 
from Addresses; 

SQL Fiddle Demo

select 
    [Name] 'Addresses/Addresse/@Name', 
    Email 'Addresses/Addresse/@Email', 
    Addressid 'Addresses/Addresse/@Addressid', 
    party1id 'Files/File/@party1id', 
    Party2ID 'Files/File/@Party2ID', 
    Party3ID 'Files/File/@Party3ID' 
from 
    t 
for xml path(''); 

SQL Fiddle Demo