我正在寻找一个SQL脚本,可用于确定是否有任何数据(即行计数)在给定数据库的任何表。
这样做的目的是在存在任何行(在任何数据库中)的情况下重新具体化数据库。
这里所说的数据库是Microsoft SQL SERVER。
谁能建议一个示例脚本?
我正在寻找一个SQL脚本,可用于确定是否有任何数据(即行计数)在给定数据库的任何表。
这样做的目的是在存在任何行(在任何数据库中)的情况下重新具体化数据库。
这里所说的数据库是Microsoft SQL SERVER。
谁能建议一个示例脚本?
当前回答
不要使用SELECT COUNT(*) FROM TABLENAME,因为这是一个资源密集型操作。应该使用SQL Server动态管理视图或系统目录来获取数据库中所有表的行数信息。
其他回答
下面是一个动态SQL方法,它也提供了模式:
DECLARE @sql nvarchar(MAX)
SELECT
@sql = COALESCE(@sql + ' UNION ALL ', '') +
'SELECT
''' + s.name + ''' AS ''Schema'',
''' + t.name + ''' AS ''Table'',
COUNT(*) AS Count
FROM ' + QUOTENAME(s.name) + '.' + QUOTENAME(t.name)
FROM sys.schemas s
INNER JOIN sys.tables t ON t.schema_id = s.schema_id
ORDER BY
s.name,
t.name
EXEC(@sql)
如果需要,将其扩展为在实例中运行所有数据库(连接到sys.databases)是很简单的。
SQL Server 2005或更高版本提供了一个相当不错的报告,显示表大小-包括行数等。这是在标准报告-它是光盘使用表。
在编程上,有一个很好的解决方案: http://www.sqlservercentral.com/articles/T-SQL/67624/
短而甜
sp_MSForEachTable 'DECLARE @t AS VARCHAR(MAX);
SELECT @t = CAST(COUNT(1) as VARCHAR(MAX))
+ CHAR(9) + CHAR(9) + ''?'' FROM ? ; PRINT @t'
输出:
在Azure上工作,不需要存储过程。
SELECT t.name AS table_name
,s.row_count AS row_count
FROM sys.tables t
JOIN sys.dm_db_partition_stats s
ON t.OBJECT_ID = s.OBJECT_ID
AND t.type_desc = 'USER_TABLE'
AND t.name NOT LIKE '%dss%' --Exclude tables created by SQL Data Sync for Azure.
AND s.index_id IN (0, 1)
ORDER BY table_name;
信贷。
我觉得这个看起来比其他的好。
USE [enter your db name here]
GO
SELECT SCHEMA_NAME(A.schema_id) + '.' +
--A.Name, SUM(B.rows) AS 'RowCount' Use AVG instead of SUM
A.Name, AVG(B.rows) AS 'RowCount'
FROM sys.objects A
INNER JOIN sys.partitions B ON A.object_id = B.object_id
WHERE A.type = 'U'
GROUP BY A.schema_id, A.Name
GO