T-SQL为什么我只能引用一次临时对象?

时间:2010-09-20 09:09:57

标签: tsql

以tmp_rows为     (         从[dbo]中选择*。[客户]     )

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

我无法得到tmp_rows的计数,因为我收到错误:无效的对象名称't​​mp_rows'

如果我评论“select *”查询一切正常

我需要选择所有行然后计算,怎么做?

4 个答案:

答案 0 :(得分:4)

with tmp_rows as 
(
    select * from [dbo].[customer]
)

select * from tmp_rows;
select @@rowcount;

通过声明您使用with宣布CTE的声明 - 可以找到有关CTE的更多信息here

答案 1 :(得分:4)

使用with关键字创建的临时对象只能使用一次。如果要多次使用它,可以创建一个临时表:

select *
into #tmp_tows
from dbo.customer

select * from #tmp_rows

select count(*) from #tmp_rows

drop table #tmp_rows

即使您想要对结果执行两次不同的操作,例如在结果之前获取计数,这也有效。

答案 2 :(得分:1)

以WITH开头的CTE以分号;结束。

但是你可以在WITH语句中有超过1个CTE:

with tmp_rows as 
(
    select * from [dbo].customer
),
count_rows as
(
    select COUNT(*) count_rows from tmp_rows
)
select * from count_rows, tmp_rows;

答案 3 :(得分:0)

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类似于本地范围的视图,而不是表格。结果集永远不会实现。如果需要实现结果集,请改用本地临时表或表变量。