运用一个T-SQL语句批量查询数据表占用空间及其行数

使用一个T-SQL语句批量查询数据表占用空间及其行数

 

要找到数据库中数据表占用的空间和存在的行数。可以使用sp_spaceused搭配数据表的名称。就可以产生该表耗用的空间和现有行数。

如:

USE ADVENTUREWORKS

GO

EXEC sp_spaceused [Sales.SalesOrderHeader]

GO

 

运用一个T-SQL语句批量查询数据表占用空间及其行数

 

但如果数据库中包含数千的数据表,如何能利用一句SQL语句来实现?

 

解决方法:

一、动态SQL:

先用T-SQL动态产生表达式,然后放到一个查询中执行。如:

USE ADVENTUREWORKS

GO

SET NOCOUNT ON

SELECT 'EXEC SP_SPACEUSED ['+S.name+'.'+T. name +'];'

FROM sys.tables T INNER JOIN sys.schemas S

ON T.SCHEMA_ID=S.SCHEMA_ID

WHERE S.NAME='HumanResources'

SET NOCOUNT OFF

结果如下:

运用一个T-SQL语句批量查询数据表占用空间及其行数

把结果复制到新的窗口执行即可得到结果。

但这种方法需要人手操作不适合自动化、定时化操作。

二、使用累加字符串的方式动态生成:

因为要自动化,所以会利用数据表的INSERT触发器,执行动态表达式。并且自动将输入的数据表,计算结果:

--建立表,执行insert触发器

USE AdventureWorks

GO

CREATE TABLE myTab

(

    TableName VARCHAR(255)

)

GO

 

 

--建立触发器:

CREATE TRIGGER tr2 ON myTab

AFTER INSERT

AS

    DECLARE @sql VARCHAR(max)

    SET @sql=''

        --使用累加字符串,产生语句

    SELECT @sql=@sql+

                        'EXEC sp_spaceused ['+TableName+']; '

            FROMinserted

            --利用EXECUTE 执行动态语句

    EXEC (@sql)

 

--新增指定的数据表名称,会自动显示数据表的使用空间:

INSERT myTab

SELECT S.name+'.'+T.name

FROM sys.tables T INNER JOIN sys.schemas S

ON T.schema_id=S.schema_id

WHERE S.name='HumanResources'

 

 运用一个T-SQL语句批量查询数据表占用空间及其行数