如何在不使用COUNT(*)的情况下获取SQL临时表中的行数



本文展示了一些有效的方法,并在下面进行了复制,但这对临时表不起作用。由于表的大小,我真的想避免COUNT(*(。

下面的第一个返回错误,第二个返回空

SELECT CONVERT(bigint, rows) 
FROM sysindexes 
WHERE id = OBJECT_ID(#temporaryTable) 
AND indid < 2 
SELECT SUM (row_count) 
FROM sys.dm_db_partition_stats 
WHERE object_id=OBJECT_ID(#temporaryTable)    
AND (index_id=0 or index_id=1); 

这是因为你必须查询tempdb,而不是你所在的任何当前数据库。我通过加入sysobjects来过滤特定的表。在执行此操作时,您必须知道#temporaryTable实际上并不是以那个名称命名的,而是以那个名称开头的。

select      o.name,
rows = CONVERT(bigint, rows) 
from        tempdb..sysindexes i
join        tempdb..sysobjects o on i.id = o.id
where       o.name like '#temporaryTable_%' 
and         indid < 2 
select      o.name,
row_count = sum(ps.row_count)
from        tempdb.sys.dm_db_partition_stats ps
join        tempdb..sysobjects o on ps.object_id = o.id
where       o.name like '#temporaryTable_%' 
and         (index_id=0 or index_id=1)
group by    o.name 

如果您的主要目标是找到行的总数,您也许可以运行以下命令:

SELECT MAX(id) FROM sys.dm_db_partition_stats

这将返回记录的最后一个id,因此将是行数(假设id是连续递增的(。

如果总行数是的主要目标

SELECT IDENTITY(INT,1,1) AS ID, FirstName,Surname  INTO NewTable FROM ExistingTable;
select max(ID) from NewTable;

注意:当另一列继承identity属性时,这将不起作用。

相关内容

最新更新