Il existe plusieurs façons de traiter les lignes manquantes, mais toutes consistent à avoir un autre ensemble de données à combiner avec vos résultats actuels.
Cela pourrait être dérivé de vos résultats, créés par un CTE ou un autre processus (comme votre exemple), ou (ma préférence) en utilisant un modèle permanent rejoindre contre.
Le modèle dans votre cas pourrait simplement être un tableau de dates, comme votre @datesTBL. La différence étant qu'il est créé à l'avance avec, par exemple, 100 ans de dates.
Votre requête peut alors être similaire à votre exemple, mais j'essaierais ce qui suit...
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
Cela place le modèle de calendrier sur la GAUCHE, et facilite ainsi de nombreuses requêtes car vous savez que le champ de date du calendrier est toujours rempli, est toujours une valeur de date uniquement (pas de partie horaire), est dans l'ordre, est simple à GROUPER PAR, etc.