Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 使用ms sql查询创建嵌套xml_Sql Server_Xml_Tsql_Xsd - Fatal编程技术网

Sql server 使用ms sql查询创建嵌套xml

Sql 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>

我有一个带有以下字段的表T1:ID、姓氏、姓名、出生日期、出生地、文档号、发布日期。 我已经创建了xml

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
表格的
模式和
样本数据吗。这很有帮助