Има няколко начина за справяне с липсващи редове, но всички са свързани с наличието на друг набор от данни, който да комбинирате с текущите си резултати.
Това може да бъде получено от вашите резултати, създадени от CTE или друг процес (като вашия пример), или (мое предпочитание) чрез използване на постоянен шаблон да се присъедините срещу.
Шаблонът във вашия случай може да бъде просто таблица с дати, като вашия @datesTBL. Разликата е, че е създаден предварително с дати, например на стойност 100 години.
Вашата заявка тогава може да е подобна на вашия пример, но бих опитал следното...
SELECT
dt.tempDate ,
InstructorID, EventStart,
EventEnd, cancelled,
cancelledInstructor,
EventType, DevName,
Room, SimLocation,
ClassLocation, Event,
Duration, TrainingDesc,
Crew, Notes,
LastAmended, InstLastAmended,
ChangeAcknowledged, Type,
OtherType, OtherTypeDesc,
CourseType
FROM
@datesTBL dt
LEFT OUTER JOIN
OpsInstructorEventsView iv
ON iv.EventStart >= dt.tempDate
AND iv.EventStart < dt.tempDate + 1
AND iv.InstructorID = @InstructorID
WHERE
dt.tempDate >= @StartDate
AND dt.tempDate <= @EndDate
ORDER BY
dt.tempDate,
iv.EventStart
Това поставя шаблона на календар от ЛЯВО и така улеснява много заявки, тъй като знаете, че полето за дата на календара е винаги попълнено, винаги е стойност само за дата (без част от времето), подредено е, лесно се ГРУПИРА ПО и т.н.