要找到数据库中数据表占用的空间和存在的行数。可以使用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 + ']; '
FROM inserted
-- 利用 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'