在数据库中搜索包含值的表

时间:2014-02-24 16:58:37

标签: sql sql-server sql-server-2008

我正在使用SQL Server 2008.我的问题是,在给定表名的情况下,是否有可能构造一个查询,该查询返回包含该表WITH值的数据库列表(意味着它不为空)?

例如,我有一个名为tbl_Name的表。我有100个数据库,其中90个tbl_Name是空的。我可以获得tbl_Name具有值的10个数据库的列表吗?

2 个答案:

答案 0 :(得分:1)

您可以使用游标和存储过程sp_msforeachdb

执行此操作 顾名思义,

sp_msforeachdb是一个为每个数据库运行某些东西的proc。您可以使用它来列出具有给定表名的所有数据库:

sp_msforeachdb 'SELECT "?" AS db from [?].sys.tables WHERE name = ''tbl_Name'''

将这些记录插入临时表可以很容易地在游标中迭代:

DROP TABLE #db_List
DROP TABLE #Not_Empty
GO
CREATE TABLE #db_List (db VARCHAR(MAX))
CREATE TABLE #Not_Empty (db VARCHAR(MAX))
GO
sp_msforeachdb 'INSERT INTO #db_List SELECT "?" AS db from [?].sys.tables WHERE name = ''tbl_Name'''
GO

SET NOCOUNT ON
DECLARE @Iterator varchar(MAX)
       ,@strSQL varchar(MAX) 
DECLARE xyz CURSOR
FOR
    --Select stuff to iterate over
    SELECT *
    FROM #db_List
OPEN xyz 
FETCH NEXT FROM xyz 
INTO @Iterator 
WHILE @@FETCH_STATUS = 0
BEGIN
--Do stuff
SET @strSQL = 'INSERT INTO #Not_Empty              
               SELECT '''+@Iterator+'''
               WHERE EXISTS (SELECT TOP 1 * FROM '+@Iterator+'..tbl_Name)
               '
Exec (@strSQL)
    FETCH NEXT FROM xyz 
    INTO @Iterator 
END
CLOSE xyz 
DEALLOCATE xyz 
GO
SET NOCOUNT OFF

答案 1 :(得分:0)

快速摘要:

从主数据库中选择 sys.databases ,从每个数据库获取所有数据库,游标(使用数据库)。使用 EXEC(sqlStatement)执行命令等...

既然你在数据库中(每个数据库都有一个名为sys.objects的表,所以你上面的段落的目标是简单地发出一个命令,如 EXEC(USE dbName) ))列出表格列表,从 sys.objects 中选择,查找“U”(用户表)的对象类型。获取名称,构建SELECT * FROM INTO #yourTemp WHERE blah blah blah将您的结果插入到您最初创建的#temp表中。通过 EXEC()

发出SQL