FOR XML 路径 open/close
FOR XML path open/close
我对当前使用的 FOR XML PATH 子句有疑问。我希望它看起来像我关注的那样:
<forecastImport>
<ctForecast>
<ctID>2</ctID>
<forecastData>
<date><day>24</day><month>12</month><year>2014</year></date>
<periodData>
<time>00:00</time>
<contactsReceived>0</contactsReceived>
</periodData>
<periodData>
<time>00:15</time>
<contactsReceived>0</contactsReceived>
</periodData>
<periodData>
<time>00:30</time>
<contactsReceived>0</contactsReceived>
</periodData>
<periodData>
<time>00:45</time>
<contactsReceived>0</contactsReceived>
</periodData>
<periodData>
<time>01:00</time>
<contactsReceived>0</contactsReceived>
</periodData>
......
<periodData>
<time>23:15</time>
<contactsReceived>0</contactsReceived>
</periodData>
<periodData>
<time>23:30</time>
<contactsReceived>0</contactsReceived>
</periodData>
<periodData>
<time>23:45</time>
<contactsReceived>0</contactsReceived>
</periodData>
</forecastData>
</ctForecast>
这是应该的,但无论我做什么我都会得到这个结果:
<forecastImport>
<ctForecast>
<CTID>2</CTID>
<forecastData>
<date>
<day>13</day>
<month>10</month>
<year>2015</year>
</date>
<periodData>
<Time>08:00:00</Time>
</periodData>
<contacsReceived>
<periodData>5.05004</periodData>
</contacsReceived>
</forecastData>
</ctForecast>
<ctForecast>
<CTID>2</CTID>
<forecastData>
<date>
<day>13</day>
<month>10</month>
<year>2015</year>
</date>
<periodData>
<Time>08:15:00</Time>
</periodData>
<contacsReceived>
<periodData>5.24004</periodData>
</contacsReceived>
</forecastData>
</ctForecast>
<ctForecast>
forecastData 应该在一整天后关闭,而不是每个时间间隔。我正在使用以下查询:
SELECT
--[ID]
[CTID]
,[forecastData/date/day] = Day(dDate)
,[forecastData/date/month] = month(dDate)
,[forecastData/date/year] = year(dDate)
,[dtmInterval] AS [forecastData/periodData/Time]
,[CO_Forecast] AS [forecastData/contacsReceived/periodData]
--,[AHT_Forecast]
FROM [ProductionForecast].[dbo].[Forecast]
FOR XML PATH ('ctForecast'), ROOT ('forecastImport')
我真的不知道该怎么做,我刚刚学习了for XML子句,目前只熟悉PATH和AUTO。我使用的是 Microsoft SQL 2014.
这是table结构:
CTID forecastData/date/day forecastData/date/month forecastData/date/year periodData/Time contacsReceived/periodData
2 13 10 2015 08:00:00 5.05004
2 13 10 2015 08:15:00 5.24004
2 13 10 2015 08:30:00 4.49004
2 13 10 2015 08:45:00 4.50004
2 13 10 2015 09:00:00 5.65004
2 13 10 2015 09:15:00 7.00006
2 13 10 2015 09:30:00 7.12006
2 13 10 2015 09:45:00 7.39006
2 13 10 2015 10:00:00 8.51007
2 13 10 2015 10:15:00 7.86006
谢谢。
亲切的问候。
你可以这样试试:
只需将整个代码粘贴到空查询中 window 并执行。适应您的需求。
DECLARE @tbl TABLE(CTID INT,day INT,month INT,year INT,Time TIME,periodData VARCHAR(100));
INSERT INTO @tbl VALUES
(2,13,10,2015,{t'08:00:00'},'5.05004')
,(2,13,10,2015,{t'08:15:00'},'5.24004')
,(2,13,10,2015,{t'08:30:00'},'4.49004')
,(2,13,10,2015,{t'08:45:00'},'4.50004')
,(2,13,10,2015,{t'09:00:00'},'5.65004')
,(2,13,10,2015,{t'09:15:00'},'7.00006')
,(2,13,10,2015,{t'09:30:00'},'7.12006')
,(2,13,10,2015,{t'09:45:00'},'7.39006')
,(2,13,10,2015,{t'10:00:00'},'8.51007')
,(2,13,10,2015,{t'10:15:00'},'7.86006');
WITH DistinctIDs AS --assuming that in your original data there are more IDs
(
SELECT DISTINCT CTID
FROM @tbl
)
,DistinctDates AS
(
SELECT DISTINCT CTID
,day
,month
,year
FROM @tbl
)
SELECT DistinctIDs.CTID
,DistinctDates.*
FROM DistinctIDs
OUTER APPLY
(
SELECT dd.day AS [date/day]
,dd.month AS [date/month]
,dd.year AS [date/year]
,PeriodData.periodData AS [node()]
FROM DistinctDates AS dd
CROSS APPLY
(
SELECT pd.Time AS [time]
,0 AS [contactsRecieved] --Don't know the meaning of this "0"... All example lines are the same...
FROM @tbl AS pd
WHERE pd.CTID=DistinctIDs.CTID
AND pd.day = dd.day
AND pd.month = dd.month
AND pd.year = dd.year
FOR XML PATH('periodData'),TYPE
) AS PeriodData(periodData)
WHERE dd.CTID=DistinctIDs.CTID
FOR XML PATH(''),TYPE
) AS DistinctDates(forecastData)
FOR XML PATH('ctForecast'), ROOT('forecastImport')
我对当前使用的 FOR XML PATH 子句有疑问。我希望它看起来像我关注的那样:
<forecastImport>
<ctForecast>
<ctID>2</ctID>
<forecastData>
<date><day>24</day><month>12</month><year>2014</year></date>
<periodData>
<time>00:00</time>
<contactsReceived>0</contactsReceived>
</periodData>
<periodData>
<time>00:15</time>
<contactsReceived>0</contactsReceived>
</periodData>
<periodData>
<time>00:30</time>
<contactsReceived>0</contactsReceived>
</periodData>
<periodData>
<time>00:45</time>
<contactsReceived>0</contactsReceived>
</periodData>
<periodData>
<time>01:00</time>
<contactsReceived>0</contactsReceived>
</periodData>
......
<periodData>
<time>23:15</time>
<contactsReceived>0</contactsReceived>
</periodData>
<periodData>
<time>23:30</time>
<contactsReceived>0</contactsReceived>
</periodData>
<periodData>
<time>23:45</time>
<contactsReceived>0</contactsReceived>
</periodData>
</forecastData>
</ctForecast>
这是应该的,但无论我做什么我都会得到这个结果:
<forecastImport>
<ctForecast>
<CTID>2</CTID>
<forecastData>
<date>
<day>13</day>
<month>10</month>
<year>2015</year>
</date>
<periodData>
<Time>08:00:00</Time>
</periodData>
<contacsReceived>
<periodData>5.05004</periodData>
</contacsReceived>
</forecastData>
</ctForecast>
<ctForecast>
<CTID>2</CTID>
<forecastData>
<date>
<day>13</day>
<month>10</month>
<year>2015</year>
</date>
<periodData>
<Time>08:15:00</Time>
</periodData>
<contacsReceived>
<periodData>5.24004</periodData>
</contacsReceived>
</forecastData>
</ctForecast>
<ctForecast>
forecastData 应该在一整天后关闭,而不是每个时间间隔。我正在使用以下查询:
SELECT
--[ID]
[CTID]
,[forecastData/date/day] = Day(dDate)
,[forecastData/date/month] = month(dDate)
,[forecastData/date/year] = year(dDate)
,[dtmInterval] AS [forecastData/periodData/Time]
,[CO_Forecast] AS [forecastData/contacsReceived/periodData]
--,[AHT_Forecast]
FROM [ProductionForecast].[dbo].[Forecast]
FOR XML PATH ('ctForecast'), ROOT ('forecastImport')
我真的不知道该怎么做,我刚刚学习了for XML子句,目前只熟悉PATH和AUTO。我使用的是 Microsoft SQL 2014.
这是table结构:
CTID forecastData/date/day forecastData/date/month forecastData/date/year periodData/Time contacsReceived/periodData
2 13 10 2015 08:00:00 5.05004
2 13 10 2015 08:15:00 5.24004
2 13 10 2015 08:30:00 4.49004
2 13 10 2015 08:45:00 4.50004
2 13 10 2015 09:00:00 5.65004
2 13 10 2015 09:15:00 7.00006
2 13 10 2015 09:30:00 7.12006
2 13 10 2015 09:45:00 7.39006
2 13 10 2015 10:00:00 8.51007
2 13 10 2015 10:15:00 7.86006
谢谢。 亲切的问候。
你可以这样试试:
只需将整个代码粘贴到空查询中 window 并执行。适应您的需求。
DECLARE @tbl TABLE(CTID INT,day INT,month INT,year INT,Time TIME,periodData VARCHAR(100));
INSERT INTO @tbl VALUES
(2,13,10,2015,{t'08:00:00'},'5.05004')
,(2,13,10,2015,{t'08:15:00'},'5.24004')
,(2,13,10,2015,{t'08:30:00'},'4.49004')
,(2,13,10,2015,{t'08:45:00'},'4.50004')
,(2,13,10,2015,{t'09:00:00'},'5.65004')
,(2,13,10,2015,{t'09:15:00'},'7.00006')
,(2,13,10,2015,{t'09:30:00'},'7.12006')
,(2,13,10,2015,{t'09:45:00'},'7.39006')
,(2,13,10,2015,{t'10:00:00'},'8.51007')
,(2,13,10,2015,{t'10:15:00'},'7.86006');
WITH DistinctIDs AS --assuming that in your original data there are more IDs
(
SELECT DISTINCT CTID
FROM @tbl
)
,DistinctDates AS
(
SELECT DISTINCT CTID
,day
,month
,year
FROM @tbl
)
SELECT DistinctIDs.CTID
,DistinctDates.*
FROM DistinctIDs
OUTER APPLY
(
SELECT dd.day AS [date/day]
,dd.month AS [date/month]
,dd.year AS [date/year]
,PeriodData.periodData AS [node()]
FROM DistinctDates AS dd
CROSS APPLY
(
SELECT pd.Time AS [time]
,0 AS [contactsRecieved] --Don't know the meaning of this "0"... All example lines are the same...
FROM @tbl AS pd
WHERE pd.CTID=DistinctIDs.CTID
AND pd.day = dd.day
AND pd.month = dd.month
AND pd.year = dd.year
FOR XML PATH('periodData'),TYPE
) AS PeriodData(periodData)
WHERE dd.CTID=DistinctIDs.CTID
FOR XML PATH(''),TYPE
) AS DistinctDates(forecastData)
FOR XML PATH('ctForecast'), ROOT('forecastImport')