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

Tsql T-SQL为什么只能引用一次临时对象?,tsql,Tsql,将tmp_行作为 从[dbo].[customer]中选择* 我无法获取tmp_行的计数,因为我得到错误:无效的对象名称“tmp_行” 如果我对select*查询进行注释,则一切正常 我需要选择所有行,然后获取它们的计数,如何做到这一点 with tmp_rows as ( select * from [dbo].[customer] ) select * from tmp_rows; select @@rowcount; 通过在“与一起使用”中声明您的语句,您就是在声明一个CT

将tmp_行作为 从[dbo].[customer]中选择*

我无法获取tmp_行的计数,因为我得到错误:无效的对象名称“tmp_行”

如果我对select*查询进行注释,则一切正常

我需要选择所有行,然后获取它们的计数,如何做到这一点

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

select * from tmp_rows;
select @@rowcount;

通过在“与一起使用”中声明您的语句,您就是在声明一个CTE-可以找到有关CTE的更多信息

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

select *
into #tmp_tows
from dbo.customer

select * from #tmp_rows

select count(*) from #tmp_rows

drop table #tmp_rows

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

以分号开头的CTE结束

但WITH语句中可以有多个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;
tmp_行是一个常见的表表达式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_行已经超出范围


请注意,CTE类似于局部范围的视图,而不是表。结果集永远不会实现。如果需要具体化结果集,请使用本地临时表或表变量。

Hm,但是@@rowcount是全局变量,对于连接到SQL Server的所有客户端都是如此?@Tony-如果@@rowcount按照您的设想行事,它会有什么用呢?实际上,使用这种解决方案,CTE是完全没有意义的。只需从dbo.customer中选择*;选择@@rowcount。@Guffa-没错,使用CTE是没有意义的,但这可能是一个简单的版本。@Tony-@@rowcount不是全局变量。它们过去被称为全局变量,但现在不再可能是为了避免这种可以理解的混乱。你为什么需要它?第一个结果包含行数,因为它包含行数。CTE不是真正的临时对象,因为它们在SQL Server中提前实现。它们的处理方式与派生表几乎相同。注意:这将包括结果中每一行的计数,而不是作为单独的结果。
-- 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;