Если что-то может происходить одновременно (в частности, если задачи вставки могут быть вставлены в то время, когда происходит другой процесс), то ни одно из существующих решений не является безопасным.
Вам необходимо вставить данные во временную таблицу, затем вставить данные из временной таблицы, а затем удалить данные из промежуточной таблицы на основе записей в временной таблице. Это гарантирует, что вы удалили только те записи, которые вы вставили, а не некоторые другие, добавленные во время вставки. И, конечно, вы должны поместить все это в транзакцию, как показывал @Ardman.
Кроме того, вы никогда не должны делать вставку без указания полей, в которые вы вставляете. Предположим, кто-то воссоздал таблицу и переставил поля, тогда ваша вставка вставит в неправильные поля (если типы данных совместимы) или потерпит неудачу.
SELECT [tour], tourname, [taskname], [deptdate], [tasktype], [desc], [duedate], [compdate], [comments], [agent], [compby], [graceperiod], completed , canceled
INTO #TasksToInsert
FROM staggingtasks
WHERE NOT EXISTS(SELECT *
FROM dashboardtasks
WHERE (staggingtasks.tour=dashboardtasks.tour
AND staggingtasks.taskname=dashboardtasks.taskname
AND staggingtasks.deptdate=dashboardtasks.deptdate
AND staggingtasks.duedate=dashboardtasks.duedate
AND staggingtasks.tourname=dashboardtasks.tourname)
)
INSERT INTO dashboardtasks ([tour], tourname, [taskname], [deptdate], [tasktype], [desc], [duedate], [compdate], [comments], [agent], [compby], [graceperiod], completed , canceled )
SELECT [tour], tourname, [taskname], [deptdate], [tasktype], [desc], [duedate], [compdate], [comments], [agent], [compby], [graceperiod], completed , canceled
FROM #TasksToInsert
DELETE FROM staggingtasks
WHERE EXISTS (SELECT *
FROM #TasksToInsert
WHERE (staggingtasks.tour=#TasksToInsert.tour
AND staggingtasks.taskname=#TasksToInsert.taskname
AND staggingtasks.deptdate=#TasksToInsert.deptdate
AND staggingtasks.duedate=#TasksToInsert.duedate
AND staggingtasks.tourname=#TasksToInsert.tourname)
)
И если он еще не запущен в производство, пожалуйста, исправьте неправильную написание StagingTasks. Или это будет раздражать ваших разработчиков на годы! Я также хотел бы рассмотреть вопрос о добавлении суррогатного ключа в таблицу dashboardTasks, так как PK с несколькими полями, как у вас, может вызвать проблемы с производительностью, которые не будут вызывать меньший ключ int, особенно если есть дочерние таблицы. Но все же сделайте уникальный индекс по натуральному ключу.