Return XML 来自 SQL 服务器存储过程

Return XML from SQL Server stored procedure

我想从 SQL 查询生成 XML,格式如下:

<Reports>
    <Header>
        <PrintedBy>XYZ </PrintedBy>
        <PrintedDate>22/01/2015</PrintedDate>
        <Image>C:/Img/a.png</Image>
        <Title>Title</Title>
    </Header>
    <Report>
        <Name>123</Name>
        <UserName></UserName>
        <Remarks></Remarks>
        <IPAddress>0.0.0.0</IPAddress>
        <DateCreated>2016-02-24T18:32:11.803</DateCreated>
        <AppID>BOS</AppID>
        <AppVersion>0.0.3.0</AppVersion>
        <LastLoggedin>2016-06-23T16:04:07.167</LastLoggedin>
    </Report>
    <Report>
        <Name>123</Name>
        <UserName></UserName>
        <Remarks></Remarks>
        <IPAddress>0.0.0.0</IPAddress>
        <DateCreated>2016-02-25T10:22:34.623</DateCreated>
        <AppID>BOS</AppID>
        <AppVersion>0.0.3.0</AppVersion>
        <LastLoggedin>2016-06-23T16:04:07.167</LastLoggedin>
    </Report>
</Reports>

Header 行应仅打印一次,不应与每个报告行重复。

对于下一个问题,您应该提供 table 结构和示例数据...

在这个答案中,我使用 table 变量来提供 header 的数据。

而且 - 因为我不愿意输入你的数据 - 我 阅读 你的 XML 到临时 table 并使用此临时 table 创建您的 select。最后的 SELECT 就是你需要的那个。您必须根据自己的需要进行调整...

关注

您 header 中的 datetime-format 是特定于文化的!避免那样。如果不是 1 月 22 日而是 1 月 9 日,人们将无法知道是几月几日。在 XML 中 - 在大多数情况下 - ISO 8601。

DECLARE @headerTbl TABLE(PrintedBy VARCHAR(100),PritnedDate DATETIME,[Image] VARCHAR(100),Title VARCHAR(100));
INSERT INTO @headerTbl VALUES('XYZ',{d'2015-01-22'},'C:/Img/a.png','Title');

DECLARE @xml XML=
'<Reports>
    <Header>
        <PrintedBy>XYZ </PrintedBy>
        <PrintedDate>2015-01-22</PrintedDate>
        <Image>C:/Img/a.png</Image>
        <Title>Title</Title>
    </Header>
    <Report>
        <Name>123</Name>
        <UserName></UserName>
        <Remarks></Remarks>
        <IPAddress>0.0.0.0</IPAddress>
        <DateCreated>2016-02-24T18:32:11.803</DateCreated>
        <AppID>BOS</AppID>
        <AppVersion>0.0.3.0</AppVersion>
        <LastLoggedin>2016-06-23T16:04:07.167</LastLoggedin>
    </Report>
    <Report>
        <Name>123</Name>
        <UserName></UserName>
        <Remarks></Remarks>
        <IPAddress>0.0.0.0</IPAddress>
        <DateCreated>2016-02-25T10:22:34.623</DateCreated>
        <AppID>BOS</AppID>
        <AppVersion>0.0.3.0</AppVersion>
        <LastLoggedin>2016-06-23T16:04:07.167</LastLoggedin>
    </Report>
</Reports>';

SELECT Rep.value('Name[1]','varchar(max)') AS Name
      ,Rep.value('UserName[1]','varchar(max)') AS UserName
      ,Rep.value('Remarks[1]','varchar(max)') AS Remarks
      ,Rep.value('IPAddress[1]','varchar(max)') AS IPAddress
      ,Rep.value('DateCreated[1]','datetime') AS DateCreated
      ,Rep.value('AppID[1]','varchar(max)') AS AppID
      ,Rep.value('AppVersion[1]','varchar(max)') AS AppVersion
      ,Rep.value('LastLoggedin[1]','datetime') AS LastLoggedin
INTO #tmpYourTable
FROM @XML.nodes('/Reports/Report') AS One(Rep);

SELECT (
         SELECT *
         FROM @headerTbl
         FOR XML PATH('Header'),TYPE
       )
       ,(
         SELECT *
         FROM #tmpYourTable
         FOR XML PATH('Report'),TYPE
       )
FOR XML PATH('Reports')

GO
DROP TABLE #tmpYourTable