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')