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

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

 

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

 

 

时间: 2024-11-03 10:25:27

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

oracle11g-使用sql语句select插入数据时怎么用行号补0为流水号做完单号保存

问题描述 使用sql语句select插入数据时怎么用行号补0为流水号做完单号保存 使用select语句像某个表中插入数据,表的单号要为该语句的ItemCode的值+5位流水号.流水号的规则是查询出来的"RowNum"的值自动补0为5为流水号.怎么出入,查询数据如图 解决方案 新增一列numerical order 类型为字符串 然后写个方法计算numerical order ,insert进去. 但只用sql语句的话,还没想到. 解决方案二: 试试这个: select itemcode

sqlserver-sql 怎实现查询数据表内出现最多次数的数据

问题描述 sql 怎实现查询数据表内出现最多次数的数据 我这里有个停车的信息表tb_Parkinginformati ,里面有addtime这个字段,我想查出,在某个时间段内(2015/6/1-2015/7/1),车辆入场最多的一个日期 我要怎么写,求解答,实在找不到了 急. 使用的是sqlserver数据库 解决方案 select max(CIID) from tb_Parkinginformati where addtime >= 2015/6/1 and addtime <= 2015/

sql语句-如何用SQL语句实现两张表(无关联)查询后,分别将各自的一个字段,插入一个新表。

问题描述 如何用SQL语句实现两张表(无关联)查询后,分别将各自的一个字段,插入一个新表. 有A.B.C三张表如下, 表 A 表B 学生ID(主键) 学生名称 课程ID(主键)| 课程名称 表 C 学生ID 课程ID (联合主键) 那么,通过SQL语句操作如何用学生姓名和课程名(只能获取学生姓名和课程名)将课程ID和学生ID插入到C表(C表中有课程ID和学生ID并且是联合主键),感激不尽. 解决方案 你可以定义2个变量,分别从表A表B用名称查询到ID.在表C的新增语句中使用这2个变量. 不过你这

sql语句怎么查询数据库最新两天的数据

问题描述 sql语句怎么查询数据库最新两天的数据 我不知道我的数据库最新数据是哪天的,我要查询最新两天的所有数据,sql语句改怎么写,怎么写后面的 解决方案 http://blog.csdn.net/hanjingjingpan/article/details/6022014 如果是48小时内 select * from info where DateDiff(hh,datetime,getDate())<48 如果是2天内 SELECT * FROM A where datediff(d,da

sql 查询指定日期时间记录sql语句与查询实例

sql 查询指定日期时间记录sql语句与查询实例  首先创建一个表abc结构如下    CREATE TABLE `cc`.`loup` (  `id` INT( 4 ) NOT NULL AUTO_INCREMENT ,  `datetimes` INT( 4 ) NULL ,  `ipaddress` VARCHAR( 20 ) NULL ,  PRIMARY KEY ( `id` )  ) ENGINE = MYISAM    再批量插入数据    INSERT INTO `loup` (

两个用SQL语句实现Discuz数据外部调用的实例

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 不得不说Discuz真的非常强大,以至于不懂任何技术的人都可以操作它,菜鸟都可以用Discuz自带的DIY功能实现一些基本的数据调用及风格.说到数据调用,使用过Discuz的站长都知道它后台自带js数据外调功能,很多站长在实现数据外调时直接拿这个自带功能去实现.但我觉得自带虽然好但是有那么点缺陷:第一,据说js调用不是太好,呵呵;第二,自带的

sql语句连接查询的问题

问题描述 我现在有两张表,一张target目标表,一张费用表,目标表一个用户每个月就一条记录,比如设定的各个要完成的目标,费用表可能一个月有好几条记录,记录已完成的数据,表之间的关联用用户的ID,现在遇到问题,想在一个列表中展示目标数据和已完成数据,目标表有目标月份日期字段,费用表有生效日期字段目标月份 目标标保 已完成标保 目标佣金 已完成佣金 目标件数 已完成件数2012-11 1000 500 200000 2000 500 50我现在sql语句如下 select SALES_CODE,t

使用Oracle sql loader批量导入数据

在性能测试中,有一项十分重要的准备工作就是准备测试数据.在进行性能测试之前,首先要保证测试数据库中有测试所需要的足够多的数据.对于数据的准备工作,有时候我会使用LoadRunner生成相应的脚本去准备数据,这样的做法有一个好处就是简便易行,然而它有一个很大的缺点就是效率太慢,当我们需要的数据量极大时,这样做是非常耗时间的,所以我觉得还需要掌握各种不同的技能来完成这个任务.以下就是我在前不久的一次测试中学到的经验: 使用oracle sql loader批量导入数据(在准备测试数据时很有用!) 生

oracl数据库sql语句怎么查询工资最低的两名员工编号,姓名,工资等信息。

问题描述 oracl数据库sql语句怎么查询工资最低的两名员工编号,姓名,工资等信息. 查询每个部门工资最低的两个员工编号,姓名,工资,等信息.关键是工资最低的两名员工 解决方案 SELECT * FROM ( SELECT bumen, price, ROW_NUMBER () OVER ( PARTITION BY bumen ORDER BY bumen, price DESC ) rn FROM table1 WHERE bumen IN ( SELECT bumen FROM tabl