我正在使用SQL Server 2008.我的问题是,在给定表名的情况下,是否有可能构造一个查询,该查询返回包含该表WITH值的数据库列表(意味着它不为空)?
例如,我有一个名为tbl_Name
的表。我有100个数据库,其中90个tbl_Name
是空的。我可以获得tbl_Name
具有值的10个数据库的列表吗?
答案 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