Наиболее очевидная проблема (и, вероятно, та, которая также вызывает сообщение об ошибке) - это отсутствие фактического оператора, к которому должен относиться последний CTE.Я предполагаю, что это должен быть оператор SELECT, который бы объединял набор результатов CTE с данными из таблицы #ENROLLEES
.
И вот тут возникает другая проблема.Кроме того факта, что имя, начинающееся с единственного #
, вряд ли рекомендуется для всего, что не является локальной временной таблицей (CTE на самом деле не является таблицей), вы также выбрали для своего CTE определенное имя, котороеуже принадлежит к существующей таблице (точнее, к уже упомянутой временной таблице #ENROLLEES
) и к той, из которой вы собираетесь получать данные.Вам определенно не следует использовать имя существующей таблицы для CTE, иначе вы не сможете присоединить ее к CTE из-за конфликта имен.
Также, на основании ее кода, последний CTEпредставляет незаконченную реализацию логики, которую вы хотите добавить в SP.Я могу предложить некоторую идею, но прежде чем я продолжу, я бы хотел, чтобы вы поняли, что на самом деле в вашем посте есть два разных запроса.Первый - найти причину сообщения об ошибке, другой - код новой логики.Как правило, вам, вероятно, лучше разделить такие запросы на отдельные вопросы, и поэтому, возможно, вы тоже в этом случае.
В любом случае, вот мое предложение:
полный список дат, которые вы хотите учесть в результирующем наборе (для этого будет использоваться CTE);
объедините этот список слева и выберите таблицу #ENROLLEES
данные для существующих дат и некоторые значения по умолчанию или NULL для несуществующих.
Может быть реализовано так:
… /* all your code up until the last WITH */
;
WITH cte AS (
SELECT CAST('7/1/11' AS date) AS dt
UNION ALL
SELECT DATEADD(d, 1, dt) as dt
FROM cte
WHERE dt < '12/1/11'
)
SELECT
cte.dt,
tmp.[Program code],
tmp.[program_name],
… /* other columns as necessary; you might also consider
enveloping some or all of the "tmp" columns in ISNULLs,
like in
ISNULL(tmp.[Program code], '(none)') AS [Program code]
to provide default values for absent data */
FROM cte
LEFT JOIN #ENROLLEES tmp ON cte.dt = tmp.pe_start_date
;