当我在我的一个脚本中使用 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
[...]
坦率地说,我不喜欢这种解决方案。有没有其他人有这个问题的最佳实践?
提前致谢!