专栏首页.NET技术与企业级解决方案统计一个数据库中,无记录的表的sql语句

统计一个数据库中,无记录的表的sql语句

SQL Server数据库中统计无记录数的表

大家使用的时候,将sql脚本中的红色[TestDB] 换成你的目标数据库名称。

 1 /************************************************************
 2  * Code formatted by SoftTree SQL Assistant ?v7.0.158
 3  * Time: 2016/5/19 18:47:02
 4  * Author:zhangcn
 5  ************************************************************/
 6 
 7 -- 指定一个数据库名称
 8 USE [TestDB];
 9 
10 DECLARE @tableCount INT = 0;                        -- 定义变量,统计一个数据库中有多少张表
11 DECLARE @rowCount INT = 0;                          -- 定义变量,记录单个表中的记录数                        
12 DECLARE @i INT = 1;                                 -- 定义变量, 用于循环计数
13 DECLARE @tableNamesWithoutData NVARCHAR(4000) = ''; -- 定义变量,用于记录数据库中哪些表没有数据
14 DECLARE @tableNamesWithoutDataCount INT = 0;        -- 定义变量,统计数据库中无无记录表的数量
15 DECLARE @tableName NVARCHAR(2000) = '';             -- 定义变量,记录单个表的名字(该表没有记录)
16 DECLARE @sql NVARCHAR(2000) = '';                   -- 定义sql,接收查询语句
17 
18 -- 统计指定的数据库中有多少张表
19 SELECT @tableCount = COUNT([name])
20 FROM   sys.objects  -- 系统基础对象所在的视图
21 WHERE  [type] = 'U'
22 
23 -- 判断临时表是否已经存在
24 IF OBJECT_ID('tempdb..#TempTable') IS NOT NULL
25 BEGIN
26     DROP TABLE #TempTable;-- 删除临时表
27 END
28 
29 -- 将指定数据库中的表名称与排序号,装入临时表中(效率很高)
30 SELECT ROW_NUMBER() OVER(ORDER BY NAME) AS rowNumber, [name]
31     INTO #TempTable 
32 FROM   sys.objects
33 WHERE  [type] = 'U'
34 
35 WHILE @i <= @tableCount
36 BEGIN
37     -- 循环计算每个表的名称
38     SELECT @tableName = [name]
39     FROM  #TempTable 
40     WHERE rowNumber = @i;
41     
42     -- 拼接sql语句,用于统计表中的记录数
43     SET @sql = ' SELECT @num = COUNT(*) FROM [' + @tableName + ']';
44     EXEC sp_executesql @sql,N'@num int output',@rowCount OUTPUT  -- 执行查询
45     
46     -- select @rowCount
47     
48     IF @rowCount = 0
49     BEGIN
50         SET @tableNamesWithoutDataCount = @tableNamesWithoutDataCount + 1; -- 无记录表计数器 + 1
51         IF @tableNamesWithoutData = ''
52         BEGIN
53             SET @tableNamesWithoutData = @tableName
54         END
55         ELSE
56         BEGIN
57             SET @tableNamesWithoutData = @tableNamesWithoutData + '、' + @tableName
58         END
59     END
60     
61     SET @i = @i + 1;     -- 计数加1
62     SET @rowCount = 0;   -- 设置为0,下次重新计算
63     SET @tableName = ''; -- 清空,下次重新计算
64     SET @sql = '';       -- 清空,下次重新计算
65 END
66 
67 SELECT @tableNamesWithoutDataCount; -- 输出无记录表的总数量
68 SELECT @tableNamesWithoutData;      -- 输出无记录表的名称

打开SQL 查询分析器,将上述脚本拷贝后运行,结果如下:

第一个查询结果,代表无记录数的表的总数量为652个;

第二个查询结果,代表无记录数的表的名称的字符串,中间用分号分割。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Linux搭建环境的详细步骤(二)

    Mysql 是一个开源的小型关联式数据库管理系统, 特点是速度快,体积小,成本低,尤其还是开源的,所以目前被广泛应用于互联网中的中小型网站中

    测试小兵
  • lua脚本操作redis数据库

    为什么要用lua脚本操作redis数据库? 1.减少开销–减少向redis服务器的请求次数 2.原子操作–redis将lua脚本作为一个原子执行 3.可复...

    编程珠玑
  • Spring是如何保证同一事务获取同一个Connection的?使用Spring的事务同步机制解决:数据库刚插入的记录却查询不到的问题【享学Spring】

    关于Spring的事务,它是Spring Framework中极其重要的一块。前面用了大量的篇幅从应用层面、原理层面进行了比较全方位的一个讲解。但是因为它过于重...

    BAT的乌托邦
  • 搭建Linux环境的详细步骤(四)

    搭建一个”Discuz ! X ”网站, 该网站是康盛公司推出的一个社区平台,包含社区论坛,社交网络,社交游戏等等

    测试小兵
  • Mariadb修改root密码

    默认情况下,新安装的 mariadb 的密码为空,在shell终端直接输入 mysql 就能登陆数据库。

    botkenni
  • 给中级Python开发者的13个练手项目,适合你不?

    该项目设计的主要目标是聚合内容。首先,我们需要知道内容聚合器从哪些站点获取内容。然后,使用请求库来发送 HTTP 请求,并使用 BeautifulSoup 解析...

    CDA数据分析师
  • 【小家java】Java中Future模式衍生出来的高级应用---自己手写一个数据库连接池

    阅读本文之前,请确保你已经了解了Java中Future模式。若没有,ring出门左转,参考博文:【小家java】一个例子让就能你彻底理解Java的Future模...

    BAT的乌托邦
  • Spring JPA起航 顶

    其中SimpleJpaRepository是他们所有接口的实现类,而JpaRepository以上其实都是兼容noSql的接口,而只有JpaRepository...

    算法之名
  • 缓存内功心法:缓存基础整理

    缓存雪崩是由于原有缓存失效(过期),新缓存未到期间。所有请求都去查询数据库,而对数据库CPU和内存造成巨大压力,严重的会造成数据库宕机。从而形成一系列连锁反应,...

    李红
  • windows一机多装mysql,5.5低版本+5.8高版本

    进入后,找到 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MySQL

    chenchenchen

扫码关注云+社区

领取腾讯云代金券