Trong SQL, CTE chỉ có thể được sử dụng / được tham chiếu trong câu lệnh (một), trong đó nó được định nghĩa. Và chúng ta biết nơi các câu lệnh kết thúc bằng cách sử dụng các dấu kết thúc câu lệnh ( ;
).
SQL Server đang tha thứ và cho phép các nhà phát triển không đặt các thiết bị đầu cuối này (trừ trường hợp đặc biệt có khiếu nại) nhưng thực sự tốt (và Microsoft khuyến nghị) nên sử dụng chúng sau mỗi câu lệnh. Nếu bạn đã đặt chúng, rõ ràng mã của bạn sẽ phân tích thành 3 câu lệnh:
--- 1st statement starts ---
with ctegeneric as (select person from people where person = 'dumb')
Select * from ctegeneric ; -- and ends here
--- 2nd statement starts ---
Select * from ctegeneric ; -- and ends here
--- 3rd statement starts ---
Select * from ctegeneric ; -- and ends here
Vì vậy, báo cáo thứ hai và thứ ba của bạn hoàn toàn không hoạt động và sẽ trả về lỗi:
INVALID OBJECT NAME: ctegeneric
Ngay khi tuyên bố nơi CTE được thực hiện kết thúc, bạn sẽ mất khả năng tham chiếu lại.
Nó giống như (đây cũng không phải là cú pháp hợp lệ, chỉ là một cách khác để suy nghĩ về CTE):
WITH ctegeneric AS (SELECT person
FROM people
WHERE person = 'dumb')
BEGIN
Select * from ctegeneric ;
END
Tuy nhiên, bạn có thể chạy ba lựa chọn với một UNION/UNION ALL
:
WITH ctegeneric AS (SELECT person
FROM people
WHERE person = 'dumb')
Select * from ctegeneric
UNION
Select * from ctegeneric
UNION
Select * from ctegeneric ;