T-SQL: многократное использование CTE-алиаса - не только во внешнем запросе.

У меня есть вопрос, который возникает, когда я использую предложение WITH в одном из моих скриптов. На вопрос легко указать, что я хочу использовать псевдоним CTE несколько раз, а не только во внешнем запросе, и в этом есть суть.

Например:

-- Define the CTE expression
WITH cte_test (domain1, domain2, [...])
AS
-- CTE query
(
    SELECT domain1, domain2, [...]
    FROM table
)
-- Outer query
SELECT * FROM cte_test
-- Now I wanna use the CTE expression another time
INSERT INTO sometable ([...]) SELECT [...] FROM cte_test

Последняя строка приведет к следующей ошибке, поскольку она находится за пределами внешнего запроса:

Сообщение 208, уровень 16, состояние 1, строка 12 Недопустимое имя объекта 'cte_test'.

Есть ли способ использовать CTE несколько раз, соответственно. сделать его постоянным? Мое текущее решение состоит в том, чтобы создать временную таблицу, в которой я сохраняю результат CTE и использую эту временную таблицу для любых дальнейших утверждений.

-- CTE
[...]
-- Create a temp table after the CTE block
DECLARE  @tmp TABLE (domain1 DATATYPE, domain2 DATATYPE, [...])
INSERT INTO @tmp (domain1, domain2, [...]) SELECT domain1, domain2, [...] FROM cte_test
-- Any further DML statements
SELECT * FROM @tmp
INSERT INTO sometable ([...]) SELECT [...] FROM @tmp
[...]

Честно говоря, мне это решение не нравится. У кого-нибудь еще есть лучшая практика для этой проблемы?

Заранее спасибо!

6
задан Mani 1 June 2012 в 15:42
поделиться