我正在一个环境中工作,其中许多用户在公用MSSQL服务器上建立了相同(或几乎相同)的测试数据库。我们正在谈论超过100个用于测试目的的数据库。至少,其中95%以上将包含我要定位的表。
这些测试数据库只填充了垃圾数据-我不会通过任何形式的搜索来影响任何人。我正在查看一个表,特别是,我需要确定是否有任何测试数据库具有该表实际上包含任何数据的表。数据是什么都没有关系,我只需要找到一个实际包含任何数据的表,就可以确定为什么该数据首先存在。 (这个数据库已经很老了-差不多有二十年了,所以有时没人能清楚地知道其中为什么有东西的存在。)
我一直在尝试构建一条遍历所有数据库的SQL语句,并专门检查该特定表以查看其是否包含任何内容,以带回具有该表包含数据的数据库列表。
因此要具体一点:我需要找到一个特定表根本没有任何内容(COUNT(*) > 0
)的所有数据库。目前,关于如何进行的线索完全不多。
答案 0 :(得分:2)
在两种方法中,都将<tablename>
替换为表名
您可以使用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
参考