T-SQL Почему я могу использовать временный объект только один раз? - PullRequest
0 голосов
/ 20 сентября 2010

с tmp_rows as (выберите * из [dbo]. [Customer])

select * from tmp_rows;
select count(*) from tmp_rows;

Я не могу получить счетчик tmp_rows, потому что получаю ошибку: Неверное имя объекта 'tmp_rows '

Если я прокомментирую запрос "select *", все в порядке

Мне нужно выбрать все строки и затем получить их количество, как это сделать?

Ответы [ 4 ]

4 голосов
/ 20 сентября 2010

Временный объект, созданный с помощью ключевого слова with, может использоваться только один раз.Вы можете создать временную таблицу, если хотите использовать ее более одного раза:

select *
into #tmp_tows
from dbo.customer

select * from #tmp_rows

select count(*) from #tmp_rows

drop table #tmp_rows

Это работает, даже если вы хотите сделать что-то другое с результатом дважды, например, получить счет до результата.

4 голосов
/ 20 сентября 2010
with tmp_rows as 
(
    select * from [dbo].[customer]
)

select * from tmp_rows;
select @@rowcount;

Объявляя свое заявление с использованием with, вы объявляете CTE - дополнительную информацию о CTE можно найти здесь

1 голос
/ 20 сентября 2010

CTE, начинающийся с WITH, заканчивается точкой с запятой ;.

Но вы можете иметь более 1 CTE в операторе WITH:

with tmp_rows as 
(
    select * from [dbo].customer
),
count_rows as
(
    select COUNT(*) count_rows from tmp_rows
)
select * from count_rows, tmp_rows;
0 голосов
/ 20 сентября 2010

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 подобны локальным областям представлений , а не таблицам.Набор результатов никогда не материализуется.Если вам нужно материализовать набор результатов, используйте вместо этого локальную временную таблицу или табличную переменную.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...