在SQL Server上的FOR XML查询中选择不同的日期部分

时间:2014-11-10 23:34:02

标签: sql sql-server xml

我需要从SQL Server数据库表中构建一些XML。

我需要吐出这个XML结构:

<shifts>
    <day workDate='2014-11-11'>
      <shift startdate='2014-11-11 10:19' enddate='2014-11-11 13:00'>
      <shift startdate='2014-11-11 14:00' enddate='2014-11-11 16:00'>
    </day>
    <day workDate='2014-11-12'>
      <shift startdate='2014-11-12 10:19' enddate='2014-11-12 13:00'>
      <shift startdate='2014-11-12 14:00' enddate='2014-11-12 16:00'>
    </day>
</shifts>

我的问题是我的XML数据是重复的。这似乎是因为每个日期有2条记录,我最终得到:

<shifts>
    <day workDate='2014-11-11'>
      <shift startdate='2014-11-11 10:19' enddate='2014-11-11 13:00'>
      <shift startdate='2014-11-11 14:00' enddate='2014-11-11 16:00'>
    </day>
    <day workDate='2014-11-11'>
      <shift startdate='2014-11-11 10:19' enddate='2014-11-11 13:00'>
      <shift startdate='2014-11-11 14:00' enddate='2014-11-11 16:00'>
    </day>
    <day workDate='2014-11-12'>
      <shift startdate='2014-11-12 10:19' enddate='2014-11-12 13:00'>
      <shift startdate='2014-11-12 14:00' enddate='2014-11-12 16:00'>
    </day>
    <day workDate='2014-11-12'>
      <shift startdate='2014-11-12 10:19' enddate='2014-11-12 13:00'>
      <shift startdate='2014-11-12 14:00' enddate='2014-11-12 16:00'>
    </day>
</shifts>

如果我可以投入“SELECT DISTINCT”,那将是非常好的,但是SQL服务器会抱怨它,因为它无法进行比较。

The xml data type cannot be selected as DISTINCT because it is not comparable.

这是SQL语句的一部分。为了简洁起见,我试图将其中的大部分内容剪掉,但它“应该”有意义。

SELECT dbo.udf_DATEVALUE(err2.ShiftStartDT) [@workDate]
,
(
    SELECT err3.Shift [@Shift],
         err3.Campus [@Campus],
         CASE WHEN murs3.AssistantNum = 0 THEN 1 ELSE 0 END [@isSIC], 
         err3.ShiftStartDT [@startdate],
         err3.ShiftFinishDT [@enddate]
    FROM ExamRoomRoster err3
        INNER JOIN MU_Roster_Supervisor murs3 ON murs3.ExamRoomRosterID = err3.ExamRoomRosterID
        INNER JOIN ExamSupervisor es3 ON es3.ExamSupervisorID = murs3.ExamSupervisorID
    WHERE err3.ExamSessionID = 104
        AND es3.ExamSupervisorID = 1297
        AND dbo.udf_DATEVALUE(err3.ShiftStartDT) = dbo.udf_DATEVALUE(err2.ShiftStartDT)
    ORDER BY err3.Shift
    FOR XML PATH ('Shift'), type
)
FROM ExamRoomRoster err2
ORDER BY dbo.udf_DATEVALUE(err2.ShiftStartDT)
FOR XML PATH ('Day'), type

基本上,ExamRoomRoster表中有多个rose,每个班次有1个,包含开始日期/时间和结束日期/时间值。

我真的很想坚持DISTINCT,然后我觉得它没问题。

SELECT DISTINCT dbo.udf_DATEVALUE(err2.ShiftStartDT) [@workDate]
...
FOR XML PATH ('Day'), type

有没有其他方法可以在没有DISTINCT的情况下执行此操作?

由于

2 个答案:

答案 0 :(得分:0)

执行此操作的一种方法是使用CTE或子查询

WITH CTE 
AS
( -- your current query
)
SELECT distinct col1, col2 ... 
FROM
CTE

答案 1 :(得分:0)

试试这个。将结果保存在子查询中,并在外部查询中使用distinct。在子查询中删除顺序并将其保留在外部查询

select Distinct * from (
SELECT  dbo.udf_DATEVALUE(err2.ShiftStartDT) [@workDate]
...
FOR XML PATH ('Day'), type) A
ORDER BY A.[@workDate]