tmp_rows
- это общее табличное выражение (CTE), и CTE ограничены областью действия на уровне оператора:
-- 1st statement, works fine.
with tmp_rows as (select * from [dbo].[customer])
select * from tmp_rows;
-- 2nd statement, returns an error, since tmp_rows is out of scope.
select count(*) from tmp_rows;
К моменту выполнения вашего второго оператора tmp_rows
уже выходит за рамки.
Имейте в виду, что CTE подобны локальным областям представлений , а не таблицам.Набор результатов никогда не материализуется.Если вам нужно материализовать набор результатов, используйте вместо этого локальную временную таблицу или табличную переменную.