I was recently contacted by a fellow team member who was interested in finding out the number of records in a temporary table which was being used as part of a long-running script.
As I had mentioned in one of my previous posts, local temporary tables are only accessible to the connection that created them. Hence, if a script is already running, the only connection that can execute queries against the local temporary table is the connection itself making this requirement a tricky one to work with.
The solution for this is to realize that all tables – permanent or local consume storage either in a system/user database or in the tempdb. Hence, we can access this meta-data to fulfill our requirement. Let’s check it out with a demo.
In any window, we can access the dynamic management view (DMV): [sys].[dm_db_partition_stats]. As we know, this DMV returns page and row-count information for every partition in the current database.
So, let’s open a new query window in the SQL Server Management Studio and run the following query:
--Create a new test database IF (DB_ID('SQLTwins') IS NULL) BEGIN CREATE DATABASE [SQLTwins]; END GO USE [SQLTwins]; GO --Window 01 BEGIN IF OBJECT_ID('tempdb..#SQLTwinsDemo','U') IS NOT NULL BEGIN DROP TABLE [dbo].[#SQLTwinsDemo]; END CREATE TABLE [dbo].[#SQLTwinsDemo] ([Number] INT NOT NULL, [Value] VARCHAR(50) NOT NULL ); INSERT INTO [dbo].[#SQLTwinsDemo] ([Number], [Value] ) VALUES (9, 'Nine' ), (8, 'Eight'), (7, 'Seven'), (6, 'Six' ), (5, 'Five' ), (4, 'Four' ), (3, 'Three'), (2, 'Two' ), (1, 'One' ); END
Now, in another window, try to run a simple row count query. As expected, it would return an error.
USE [SQLTwins]; GO SELECT COUNT(*) FROM [dbo].[#SQLTwinsDemo]; GO
Msg 208, Level 16, State 0, Line 3 Invalid object name '#SQLTwinsDemo'.
Now, let’s use the DMV: [sys].[dm_db_partition_stats] in another window to get the row count information.
USE [SQLTwins]; GO --Now, do this in Window #2 BEGIN SELECT [st].[name] AS [TableName], [partitionStatistics].[row_count] AS [RowCount] FROM [tempdb].[sys].[dm_db_partition_stats] AS [partitionStatistics] INNER JOIN [tempdb].[sys].[tables] AS [st] ON [st].[object_id] = [partitionStatistics].[object_id] WHERE [st].[name] LIKE '%SQLTwinsDemo%' AND ([partitionStatistics].[index_id] = 0 --Table is a heap OR [partitionStatistics].[index_id] = 1 --Table has a clustered index ) END
Hope it helps!
Until we meet next time,
Be courteous. Drive responsibly,