0

是否可以在 SQL Server 中使用“FOR XML”生成以下 XML

    <Person>
    <HomeID>1</HomeID>
      <DayID>1</DayID>
          <String>I get up at  07:00</String>
          <String>I have breakfast at  07:30</String>
          <String>I go to office at  08:00</String>
          <String>I have lunch at  13:00</String>
          <String>I come back from office at  17:00</String>
          <String>I have dinner at  19:00</String>
          <String>I sleep at  21:30</String>
      <DayID>2</DayID>   
          <String>I get up at  08:00</String>
          <String>I have breakfast at  08:30</String>
          <String>I have lunch at  13:00</String>
          <String>I have dinner at  20:00</String>
          <String>I sleep at  23:00</String>
    </Person>
    <Person>
    <HomeID>2</HomeID>
      <DayID>1</DayID>
          <String>I get up at  07:00</String>
          <String>I have breakfast at  07:30</String>
          <String>I go to office at  08:00</String>
          <String>I have lunch at  13:00</String>
          <String>I come back from office at  17:00</String>
          <String>I have dinner at  19:00</String>
          <String>I sleep at  21:30</String>
      <DayID>2</DayID>        
          <String>I get up at  08:00</String>
          <String>I have breakfast at  08:30</String>
          <String>I have lunch at  13:00</String>
          <String>I have dinner at  20:00</String>
          <String>I sleep at  23:00</String>
    <Person>

我最初的尝试非常糟糕。

    Select HomeID,
    (
    Select DayID,
    (
    SELECT TB2.RndString+' '+CAST(TB1.timevalue AS varchar(5)) 
    FROM TB1,TB2
    where TB1.DayID=TB2.DayType and TB1.TimeCode=TB2.StringCode
    FOR XML PATH ('String'), TYPE
    )
    from TB1
    for XML AUTO, TYPE
    )
    from TB1
    for XML AUTO, ELEMENTS

我有两张桌子,TB1 和 TB2。

TB1 中的字段为 HomeID、DayID、TimeCode、timevalue。

    HomeID  DayID   TimeCode    timevalue
    1       1       1           07:00:00
    1       1       2           07:30:00
    1       1       3           08:00:00
    1       1       4           13:00:00
    1       1       5           17:00:00
    1       1       6           19:00:00
    1       1       7           21:30:00
    1       2       1           08:00:00
    1       2       2           08:30:00
    1       2       3           13:00:00
    1       2       4           20:00:00
    1       2       5           23:00:00
    2       1       1           08:00:00
    2       1       2           08:30:00
    2       1       3           09:00:00
    2       1       4           13:00:00
    2       1       5           18:00:00
    2       1       6           20:00:00
    2       1       7           22:00:00
    2       2       1           09:00:00
    2       2       2           10:00:00
    2       2       3           13:00:00
    2       2       4           19:00:00
    2       2       5           22:30:00

TB2 中的字段为 DayType、StringCode、RndString。

    DayType     StringCode  RndString
    1       1           I get up at 
    1       2           I have breakfast at 
    1       3           I go to office at 
    1       4           I have lunch at 
    1       5           I come back from office at 
    1       6           I have dinner at 
    1       7           I sleep at 
    2       1           I get up at 
    2       2           I have breakfast at 
    2       3           I have lunch at 
    2       4           I have dinner at 
    2       5           I sleep at 

注意: TB1.DayID=TB2.DayType 和 TB1.TimeCode=TB2.StringCode

4

1 回答 1

2

我不认为你想要的 XML 对你来说是最佳的,所以我会为你推荐另一种结构。

select T1_1.HomeID as [@HomeID],
       (
       select T1_2.DayID as [@ID],
              (
              select T2.RndString+' '+left(T1_3.TimeValue, 5) as '*'
              from TB1 as T1_3
                inner join TB2 as T2
                  on T1_3.DayID = T2.DayType and
                     T1_3.TimeCode = T2.StringCode
              where T1_2.HomeID = T1_3.HomeID and
                    T1_2.DayID = T1_3.DayID
              order by T2.StringCode
              for xml path('String'), type
              )
       from TB1 as T1_2
       where T1_2.HomeID = T1_1.HomeID
       group by T1_2.DayID,
                T1_2.HomeID
       order by T1_2.DayID
       for xml path('Day'), type
       )
from TB1 as T1_1
group by T1_1.HomeID
order by T1_1.HomeID
for xml path('Person')

结果:

<Person HomeID="1">
  <Day ID="1">
    <String>I get up at 07:00</String>
    <String>I have breakfast at  07:30</String>
    <String>I go to office at 08:00</String>
    <String>I have lunch at 13:00</String>
    <String>I come back from office at 17:00</String>
    <String>I have dinner at 19:00</String>
    <String>I sleep at 21:30</String>
  </Day>
  <Day ID="2">
    <String>I get up at 08:00</String>
    <String>I have breakfast at 08:30</String>
    <String>I have lunch at 13:00</String>
    <String>I have dinner at 20:00</String>
    <String>I sleep at 23:00</String>
  </Day>
</Person>
<Person HomeID="2">
  <Day ID="1">
    <String>I get up at 08:00</String>
    <String>I have breakfast at  08:30</String>
    <String>I go to office at 09:00</String>
    <String>I have lunch at 13:00</String>
    <String>I come back from office at 18:00</String>
    <String>I have dinner at 20:00</String>
    <String>I sleep at 22:00</String>
  </Day>
  <Day ID="2">
    <String>I get up at 09:00</String>
    <String>I have breakfast at 10:00</String>
    <String>I have lunch at 13:00</String>
    <String>I have dinner at 19:00</String>
    <String>I sleep at 22:30</String>
  </Day>
</Person>

SQL小提琴

于 2013-05-22T10:06:37.850 回答