This script refines the one submitted by pochinej.
It returns the data in table format instead of table by table.
This script refines the one submitted by pochinej.
It returns the data in table format instead of table by table.
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[sp_AllTableSpace]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[sp_AllTableSpace]
GO
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[sp_TableSpaceCursor]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[sp_TableSpaceCursor]
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS OFF
GO
CREATE PROCEDURE sp_AllTableSpace AS
--Uses sp_tablespacecursor to populate temp table with all table space data.
CREATE TABLE #temp
(
TableNamevarchar(50) NULL,
NumberOfRowsint NULL,
DataSpaceUsed int NULL,
IndexSpaceUsed int NULL
)
SET NOCOUNT ON
DECLARE @TableName varchar(50),
@NumberOfRowsint,
@DataSpaceUsed int,
@IndexSpaceUsed int
DECLARE gettable INSENSITIVE CURSOR FOR
Select name from sysobjects
where type = 'U'
FOR READ ONLY
OPEN gettable
FETCH NEXT FROM gettable INTO @TableName
WHILE (@@FETCH_STATUS = 0)
BEGIN
DECLARE @recordlist CURSOR
EXECUTE sp_TableSpaceCursor @TableName,@recordlist OUTPUT
FETCH NEXT FROM @recordlist INTO @NumberOfRows, @DataSpaceUsed, @IndexSpaceUsed
WHILE (@@FETCH_STATUS = 0)
BEGIN
INSERT INTO #temp (TableName, NumberOfRows, DataSpaceUsed, IndexSpaceUsed)
VALUES (@TableName, @NumberOfRows, @DataSpaceUsed, @IndexSpaceUsed)
FETCH NEXT FROM @recordlist INTO @NumberOfRows, @DataSpaceUsed, @IndexSpaceUsed
END
CLOSE @recordlist
DEALLOCATE @recordlist
FETCH NEXT FROM gettable INTO @TableName
END
CLOSE gettable
DEALLOCATE gettable
SET NOCOUNT OFF
Select * from #temp order by TableName ASC
Drop Table #temp
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
CREATE procedure sp_TableSpaceCursor
@name nvarchar(517),
@recordlist CURSOR VARYING OUTPUT
as
--SWB 31 December 2001
--returns a cursor containing the space utilization data for specified table.
SET NOCOUNT ON
declare @rows int, @datasizeused int, @indexsizeused int, @pagesize int
declare @dbname nvarchar(128)
declare @id int
select @dbname = db_name()
if (@id is null)
select @id = id from dbo.sysobjects where id = object_id(@name) and (OBJECTPROPERTY(id, N'IsTable') = 1)
if (@id is null)
begin
RAISERROR (15009, -1, -1, @name, @dbname)
return 1
end
/* rows */SELECT @rows = convert(int, rowcnt)
FROM dbo.sysindexes
WHERE indid < 2 and id = @id
/* data */SELECT @datasizeused =
(SELECT sum(dpages)
FROM dbo.sysindexes
WHERE indid < 2 and id = @id)
+
(SELECT isnull(sum(used), 0)
FROM dbo.sysindexes
WHERE indid = 255 and id = @id)
/* Do not consider 2 < indid < 255 rows, those are nonclustered indices, and the space used by them are included by indid = 0(table) */ /* or indid = 1(clustered index) already. indid = 0(table) and = 1(clustered index) are mutual exclusive *//* index */SELECT @indexsizeused =
(SELECT sum(used)
FROM dbo.sysindexes
WHERE indid in (0, 1, 255) and id = @id)
- @datasizeused
/* Pagesize on this server (sysindexes stores size info in pages) */select @pagesize = v.low / 1024 from master..spt_values v where v.number=1 and v.type=N'E'
SET @recordlist = CURSOR
FOR
select Rows = @rows, DataSpaceUsed = @datasizeused * @pagesize, IndexSpaceUsed = @indexsizeused * @pagesize
OPEN @recordlist
RETURN
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO