Hay varias formas de lidiar con las filas que faltan, pero todas se tratan de tener otro conjunto de datos para combinar con los resultados actuales.
Eso podría derivarse de sus resultados, creados por un CTE u otro proceso (como su ejemplo), o (mi preferencia) mediante el uso de una plantilla permanente unirse en contra.
La plantilla en su caso podría ser simplemente una tabla de fechas, como su @datesTBL. La diferencia es que se crea por adelantado con, por ejemplo, 100 años de fechas.
Su consulta puede ser similar a su ejemplo, pero intentaría lo siguiente...
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
Esto pone la plantilla de calendario a la IZQUIERDA, lo que facilita muchas consultas, ya que sabe que el campo de fecha del calendario siempre está lleno, siempre es un valor de fecha solamente (sin parte de tiempo), está en orden, es fácil de AGRUPAR POR, etc.