要找到数据库中数据表占用的空间和存在的行数。可以使用sp_spaceused搭配数据表的名称。就可以产生该表耗用的空间和现有行数。
如:
USE ADVENTUREWORKS
GO
EXEC sp_spaceused [Sales.SalesOrderHeader]
GO
但如果数据库中包含数千的数据表,如何能利用一句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
结果如下:
把结果复制到新的窗口执行即可得到结果。
但这种方法需要人手操作不适合自动化、定时化操作。
二、使用累加字符串的方式动态生成:
因为要自动化,所以会利用数据表的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'