Что касается того, почему это недопустимо, то, допустив, что эти SELECT
операции с побочными эффектами вызовут всевозможные проблемы, которые я себе представляю.
CTE не материализуются заранее в свои собственныевременная таблица, что же должно возвращать следующее:
;WITH Hey (Name)
AS
(
...
)
SELECT name
FROM Hey
JOIN some_other_table ON Name = name
Если Оптимизатор запросов решил использовать план с вложенными циклами и Hey
в качестве таблицы управления, то предположительно произойдет одна вставка.Однако, если бы он использовал some_other_table
в качестве таблицы управления, тогда CTE будет оцениваться столько раз, сколько строк в этой другой таблице, и поэтому произойдет многократное вставление.За исключением случаев, когда Оптимизатор запросов решил добавить катушку в план, и тогда он будет оцениваться только один раз.
Предположительно, избегание такого рода беспорядков является мотивацией для этого ограничения (как с ограничениями на побочные эффекты в функциях)