本文展示了一些有效的方法,并在下面进行了复制,但这对临时表不起作用。由于表的大小,我真的想避免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属性时,这将不起作用。