sql server正式库及测试库中,通过sql脚本,筛选出不同行数的表。

张开发
2026/4/8 5:03:11 15 分钟阅读

分享文章

sql server正式库及测试库中,通过sql脚本,筛选出不同行数的表。
我们经常遇到数据库迁移或同步后的校验场景。面对如此多的表10000个表名手动编写 SQL 是一项巨大的工程。这段 SQL 利用 SQL Server 的系统视图INFORMATION_SCHEMA.TABLES和动态 SQL 机制自动遍历所有用户表并通过EXCEPT关键字找出本地与远程行数不一致的表。核心 SQL 代码你可以直接在你的本地 SQL Server Management Studio (SSMS) 或其他查询工具中执行以下代码。注意请确保你的本地数据库已经配置了指向远程服务器的链接服务器 (Linked Server)并在代码中将LinkedServerName替换为实际的链接服务器名称。代码中过滤了sys开头的系统表仅针对用户表进行比对。-- 声明变量用于存储动态SQL DECLARE Sql NVARCHAR(MAX) ; -- 生成动态SQL遍历当前数据库中的所有用户表 -- 并与远程链接服务器上的同名表进行行数比对 SELECT Sql Sql SELECT TABLE_SCHEMA . TABLE_NAME AS TableName, (SELECT COUNT(*) FROM QUOTENAME(TABLE_SCHEMA) . QUOTENAME(TABLE_NAME) ) AS LocalCount, (SELECT COUNT(*) FROM LinkedServerName QUOTENAME(TABLE_SCHEMA) . QUOTENAME(TABLE_NAME) ) AS RemoteCount EXCEPT SELECT TABLE_SCHEMA . TABLE_NAME , (SELECT COUNT(*) FROM QUOTENAME(TABLE_SCHEMA) . QUOTENAME(TABLE_NAME) ), (SELECT COUNT(*) FROM LinkedServerName QUOTENAME(TABLE_SCHEMA) . QUOTENAME(TABLE_NAME) ); CHAR(13) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE BASE TABLE AND TABLE_NAME NOT LIKE sys%; -- 排除系统表 -- 打印生成的SQL可选用于检查 -- PRINT Sql; -- 执行动态SQL EXEC sp_executesql Sql;代码逻辑解析动态构建脚本首先查询本地的INFORMATION_SCHEMA.TABLES获取所有表名。双向计数对于每一个表它构建两条COUNT(*)语句一条统计本地行数。一条统计远程行数通过链接服务器语法。差异筛选使用EXCEPT操作符。如果本地行数与远程行数完全相同这两行会被消除只有当行数不一致时结果才会被保留并显示出来。预期结果执行后你将得到一个结果集包含以下列TableNameLocalCountRemoteCountdbo.TableA1000999dbo.TableB5000TableName行数不一致的表名。LocalCount本地该表的行数。RemoteCount远程数据库该表的行数。

更多文章