我有一個問題,當我在我的一個腳本中使用WITH子句時發生。這個問題很容易指出,我想多次使用CTE別名,而不是僅在外部查詢中使用CTE別名,並且存在癥結。T-SQL:多次使用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的結果,並將此臨時表用於任何進一步的語句。
-- 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
[...]
坦率地說,我不喜歡這個解決方案。其他人是否有這個問題的最佳做法?
在此先感謝!
你可以用'MERGE'語句,或許用'OUTPUT'子句,而不是'SELECT'作爲CTE的使用者來實現你的目標嗎? – HABO
你爲什麼要從cte中「刪除」? – Johan
@Johan:進一步的陳述不是重點,可以是任何其他DML語句,例如'INSERT'&c。 – Neil