我正在寻找一个SQL脚本,可用于确定是否有任何数据(即行计数)在给定数据库的任何表。
这样做的目的是在存在任何行(在任何数据库中)的情况下重新具体化数据库。
这里所说的数据库是Microsoft SQL SERVER。
谁能建议一个示例脚本?
我正在寻找一个SQL脚本,可用于确定是否有任何数据(即行计数)在给定数据库的任何表。
这样做的目的是在存在任何行(在任何数据库中)的情况下重新具体化数据库。
这里所说的数据库是Microsoft SQL SERVER。
谁能建议一个示例脚本?
当前回答
从information_schema中选择所有行。表视图,并为从该视图返回的每个条目发出count(*)语句。
declare c_tables cursor fast_forward for
select table_name from information_schema.tables
open c_tables
declare @tablename varchar(255)
declare @stmt nvarchar(2000)
declare @rowcount int
fetch next from c_tables into @tablename
while @@fetch_status = 0
begin
select @stmt = 'select @rowcount = count(*) from ' + @tablename
exec sp_executesql @stmt, N'@rowcount int output', @rowcount=@rowcount OUTPUT
print N'table: ' + @tablename + ' has ' + convert(nvarchar(1000),@rowcount) + ' rows'
fetch next from c_tables into @tablename
end
close c_tables
deallocate c_tables
其他回答
下面是一个动态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)是很简单的。
不要使用SELECT COUNT(*) FROM TABLENAME,因为这是一个资源密集型操作。应该使用SQL Server动态管理视图或系统目录来获取数据库中所有表的行数信息。
SELECT
sc.name +'.'+ ta.name TableName, SUM(pa.rows) RowCnt
FROM
sys.tables ta
INNER JOIN sys.partitions pa
ON pa.OBJECT_ID = ta.OBJECT_ID
INNER JOIN sys.schemas sc
ON ta.schema_id = sc.schema_id
WHERE ta.is_ms_shipped = 0 AND pa.index_id IN (1,0)
GROUP BY sc.name,ta.name
ORDER BY SUM(pa.rows) DESC
我会对弗雷德里克的方案做些小改动。我将使用sp_spaceused系统存储过程,它还将包括数据和索引大小。
declare c_tables cursor fast_forward for
select table_name from information_schema.tables
open c_tables
declare @tablename varchar(255)
declare @stmt nvarchar(2000)
declare @rowcount int
fetch next from c_tables into @tablename
while @@fetch_status = 0
begin
select @stmt = 'sp_spaceused ' + @tablename
exec sp_executesql @stmt
fetch next from c_tables into @tablename
end
close c_tables
deallocate c_tables
短而甜
sp_MSForEachTable 'DECLARE @t AS VARCHAR(MAX);
SELECT @t = CAST(COUNT(1) as VARCHAR(MAX))
+ CHAR(9) + CHAR(9) + ''?'' FROM ? ; PRINT @t'
输出: