2015-02-09 44 views
0

我有一个表T1与以下字段:ID,姓氏,名称,BirthDate,BirthPlace,DocNumber,IssueDate。 我已经使用MS SQL查询创建嵌套的XML

select * from T1 
for XML PATH ('Person') 

创建的XML这造就了我用XML格式如下

<Person> 
    <ID>1</ID> 
    <SurName>Ivanov</SurName> 
    ... 
</Person> 
<Person> 
... 
</Person> 
... 

此XML仅包含一个元素,这是“人”,我想创造另一个元素(“文件')在此元素内,类似于:

<Person> 
    <ID>1</ID> 
    <SurName>Ivanov</SurName> 
    ... 
    <Documents> 
     <DocNumber>1234</DocNumber> 
     <IssueDate>'20140101'</IssueDate> 
    </Documents> 
</Person> 
... 

我该怎么做?有什么建议么?提前致谢。

的样本数据

ID SurName Name BirthDate BirthPlace DocNumber IssueDate 
1 Ivanov Ivan '19900212' Moscow  1111  '20121225' 
1 Ivanov Ivan '19900212' Moscow  2222  '20110629' 
2 Smirnov Petr '19851006' Kazan  3333  '20090601' 
2 Smirnov Petr '19851006' Kazan  4444  '20130930' 
+0

可以共享'schema'和T1'表 – 2015-02-09 11:16:00

+0

感谢大家的''样品data'。这是有帮助的http://stackoverflow.com/questions/11658942/sql-server-for-xml-path-nesting-grouping – 2015-02-09 11:35:16

回答

0

你需要看一下FOR XML PATH选项,SQL Server 2005中引入了 - 见What's New in FOR XML in Microsoft SQL Server 2005文件以获取更多信息。

基本上,使用FOR XML PATH,您可以非常轻松地定义XML的形状。您可以定义某些结构,您可以定义某些列作为属性输出,其他列作为元素 - 完全在您的控制之下。

不知道你的表结构,我只能猜测一下表和列被称为你的情况 - 但你也许可以写类似:

Select 
      tt1.ID AS 'ID', 
      tt1.Surname As 'Surname', 
      ... 
      ( 
      Select 
       tt2.DocNumber As 'DocNumber', 
       tt2.Issudate AS 'IssueDate', 
      From 
       T1 as tt2 WITH(NOLOCK) 
      Where 
       tt2.ID = tt1.ID 
      for xml path('Documents'), type 
      ) 
    From 
     t1 as tt1 
    For xml path ('Person') 
0

你需要一个子查询,以提供所需的嵌套:

SQL Fiddle

MS SQL Server 2012的架构设置

CREATE TABLE T1 
     ([ID] int, [SurName] varchar(7), [Name] varchar(4), 
     [BirthDate] datetime, [BirthPlace] varchar(6), 
     [DocNumber] int, [IssueDate] datetime) 
    ; 

INSERT INTO T1 
    ([ID], [SurName], [Name], [BirthDate], [BirthPlace], [DocNumber], [IssueDate]) 
VALUES 
    (1, 'Ivanov', 'Ivan', '1990-02-12 00:00:00', 'Moscow', 1111, '2012-12-25 00:00:00'), 
    (1, 'Ivanov', 'Ivan', '1990-02-12 00:00:00', 'Moscow', 2222, '2011-06-29 00:00:00'), 
    (2, 'Smirnov', 'Petr', '1985-10-06 00:00:00', 'Kazan', 3333, '2009-06-01 00:00:00'), 
    (2, 'Smirnov', 'Petr', '1985-10-06 00:00:00', 'Kazan', 4444, '2013-09-30 00:00:00') 
; 

查询1

SELECT [ID], [SurName], [Name], [BirthDate], [BirthPlace], 
(SELECT [DocNumber], [IssueDate] 
FROM T1 AS T2 
WHERE T1.ID = T2.ID 
FOR XML PATH ('Document'), type) 
FROM T1 
GROUP BY [ID], [SurName], [Name], [BirthDate], [BirthPlace] 
FOR XML PATH ('Person') 

产地:

<Person> 
    <ID>1</ID> 
    <SurName>Ivanov</SurName> 
    <Name>Ivan</Name> 
    <BirthDate>1990-02-12T00:00:00</BirthDate> 
    <BirthPlace>Moscow</BirthPlace> 
    <Document> 
    <DocNumber>1111</DocNumber> 
    <IssueDate>2012-12-25T00:00:00</IssueDate> 
    </Document> 
    <Document> 
    <DocNumber>2222</DocNumber> 
    <IssueDate>2011-06-29T00:00:00</IssueDate> 
    </Document> 
</Person> 
<Person> 
    <ID>2</ID> 
    <SurName>Smirnov</SurName> 
    <Name>Petr</Name> 
    <BirthDate>1985-10-06T00:00:00</BirthDate> 
    <BirthPlace>Kazan</BirthPlace> 
    <Document> 
    <DocNumber>3333</DocNumber> 
    <IssueDate>2009-06-01T00:00:00</IssueDate> 
    </Document> 
    <Document> 
    <DocNumber>4444</DocNumber> 
    <IssueDate>2013-09-30T00:00:00</IssueDate> 
    </Document> 
</Person>