如何在多个数据库中查找不为空的特定表(大多数/全部)

时间:2019-02-11 22:45:01

标签: sql sql-server tsql

我正在一个环境中工作,其中许多用户在公用MSSQL服务器上建立了相同(或几乎相同)的测试数据库。我们正在谈论超过100个用于测试目的的数据库。至少,其中95%以上将包含我要定位的表。

这些测试数据库只填充了垃圾数据-我不会通过任何形式的搜索来影响任何人。我正在查看一个表,特别是,我需要确定是否有任何测试数据库具有该表实际上包含任何数据的表。数据是什么都没有关系,我只需要找到一个实际包含任何数据的表,就可以确定为什么该数据首先存在。 (这个数据库已经很老了-差不多有二十年了,所以有时没人能清楚地知道其中为什么有东西的存在。)

我一直在尝试构建一条遍历所有数据库的SQL语句,并专门检查该特定表以查看其是否包含任何内容,以带回具有该表包含数据的数据库列表。

因此要具体一点:我需要找到一个特定表根本没有任何内容(COUNT(*) > 0)的所有数据库。目前,关于如何进行的线索完全不多。

1 个答案:

答案 0 :(得分:2)

在两种方法中,都将<tablename>替换为表名

使用sp_foreachdb

您可以使用sp_foreachDb

CREATE TABLE ##TBLTEMP(dbname varchar(100), rowscount int)

DECLARE @command varchar(4000) 
SELECT @command = 
'if exists(select 1 from [?].INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME =''<TABLE NAME>'') insert into ##TBLTEMP(dbname,rowscount) select ''[?]'',count(*) from [?].dbo.<tablename>' 
EXEC sp_MSforeachdb @command


SELECT * FROM ##TBLTEMP WHERE rowscount > 0

DROP TABLE ##TBLTEMP

使用游标

CREATE TABLE ##TBLTEMP(dbname  varchar(100), rowscount int)
DECLARE @dbname  Varchar(100), @strQuery varchar(4000)

DECLARE csr CURSOR FOR SELECT [name] FROM sys.databases
FETCH NEXT FROM csr INTO @dbname

WHILE @@FETCH_STATUS = 0
BEGIN

SET @strQuery = 'if exists(select 1 from [' + @dbname +'].INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME =''<TABLE NAME>'') INSERT INTO ##TBLTEMP(dbname,rowscount) SELECT ''' + @dbname + '' ', COUNT(*) FROM [' + @dbname + '].[dbo].<table name>'

EXEC(@strQuery)

FETCH NEXT FROM csr INTO @dbname


END

CLOSE csr
DEALLOCATE csr

SELECT * FROM ##TBLTEMP where rowscount > 0

参考