Istnieje kilka sposobów radzenia sobie z brakującymi wierszami, ale wszystkie dotyczą posiadania innego zestawu danych, który można połączyć z bieżącymi wynikami.
Może to wynikać z Twoich wyników, utworzonych przez CTE lub inny proces (np. Twój przykład) lub (moje preferencje) za pomocą stałego szablonu do przyłączenia się.
Szablon w twoim przypadku może być po prostu tabelą dat, taką jak twój @datesTBL. Różnica polega na tym, że jest tworzony z wyprzedzeniem, na przykład ze 100-letnimi datami.
Twoje zapytanie może być wtedy podobne do twojego przykładu, ale spróbowałbym następujących...
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
Spowoduje to umieszczenie szablonu kalendarza po LEWEJ, dzięki czemu wiele zapytań jest łatwiejszych, ponieważ wiesz, że pole daty w kalendarzu jest zawsze wypełnione, zawsze zawiera tylko datę (bez części czasowej), jest w porządku, można je łatwo GRUPOWAĆ WEDŁUG itp.