Esistono diversi modi per gestire le righe mancanti, ma tutti riguardano l'avere un altro set di dati da combinare con i risultati correnti.
Ciò potrebbe essere derivato dai tuoi risultati, creato da un CTE o da un altro processo (come il tuo esempio) o (la mia preferenza) utilizzando un modello permanente contro cui unirsi.
Il modello nel tuo caso potrebbe essere solo una tabella di date, come il tuo @datesTBL. La differenza è che viene creato in anticipo con, ad esempio, 100 anni di date.
La tua query potrebbe quindi essere simile al tuo esempio, ma proverei quanto segue...
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
Questo inserisce il modello di calendario a SINISTRA, e quindi semplifica molte query poiché sai che il campo della data del calendario è sempre compilato, è sempre un valore di sola data (nessuna parte temporale), è in ordine, è semplice da GROUP BY, ecc.