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
我想从 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