Sql server 使用ms sql查询创建嵌套xml
我有一个带有以下字段的表T1:ID、姓氏、姓名、出生日期、出生地、文档号、发布日期。 我已经创建了xmlSql server 使用ms sql查询创建嵌套xml,sql-server,xml,tsql,xsd,Sql Server,Xml,Tsql,Xsd,我有一个带有以下字段的表T1:ID、姓氏、姓名、出生日期、出生地、文档号、发布日期。 我已经创建了xml select * from T1 for XML PATH ('Person') 这为我创建了以下格式的xml <Person> <ID>1</ID> <SurName>Ivanov</SurName> ... </Person> <Person> ... </Person>
select * from T1
for XML PATH ('Person')
这为我创建了以下格式的xml
<Person>
<ID>1</ID>
<SurName>Ivanov</SurName>
...
</Person>
<Person>
...
</Person>
...
您需要查看SQL Server 2005引入的FOR XML PATH选项-有关详细信息,请参阅文档 基本上,使用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')
您需要一个子查询来提供所需的嵌套: 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')
;
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')
查询1:
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')
;
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>
1.
伊万诺夫
伊凡
1990-02-12T00:00:00
莫斯科
1111
2012-12-25T00:00:00
2222
2011-06-29T00:00:00
2.
斯米尔诺夫
彼得
1985-10-06T00:00:00
喀山
3333
2009-06-01T00:00:00
4444
2013-09-30T00:00:00
谢谢大家,你能分享T1
表格的模式和样本数据吗。这很有帮助