Tôi có một câu hỏi xảy ra khi tôi đang sử dụng mệnh đề WITH trong một tập lệnh của tôi. Câu hỏi là dễ dàng để chỉ ra tôi muốn sử dụng bí danh CTE nhiều lần thay vì chỉ trong truy vấn bên ngoài và có mấu chốt.T-SQL: sử dụng nhiều bí danh CTE - không chỉ trong truy vấn bên ngoài
Ví dụ:
-- 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
Hàng cuối cùng sẽ dẫn đến các lỗi sau vì nó bên ngoài truy vấn bên ngoài:
Msg 208, Level 16, State 1, Line 12 tên đối tượng không hợp lệ 'cte_test'.
Có cách nào để sử dụng CTE nhiều lần không. làm cho nó liên tục? Giải pháp hiện tại của tôi là tạo một bảng tạm thời nơi tôi lưu trữ kết quả của CTE và sử dụng bảng tạm thời này cho bất kỳ câu lệnh nào khác.
-- 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
[...]
Thành thật mà nói, tôi không thích giải pháp này. Có ai khác có thực hành tốt nhất cho vấn đề này không?
Cảm ơn trước!
Bạn có thể hoàn thành mục tiêu của mình bằng cách sử dụng câu lệnh 'MERGE', có lẽ với mệnh đề' OUTPUT', thay vì 'SELECT' làm người tiêu dùng CTE của bạn? – HABO
Tại sao bạn muốn 'DELETE' từ một cte? – Johan
@Johan: câu lệnh tiếp theo không phải là điểm, có thể là bất kỳ câu lệnh DML nào khác như 'INSERT' & c. – Neil