2014-09-18 66 views
0

我有一个超过200个数据库对象的列表。所有这些都是表,存储过程和视图。如果给出SQL Server对象的列表,如何确定每个对象驻留在哪个数据库中?

所有这些对象存在一个特定的SQL Server上,但我并没有给出一个字段中指定该数据库中的每个对象的归属。

考虑到特定服务器上的某个地方存在数据库对象的列表,怎么能我查询服务器为每个对象提供包含的数据库名称?

+0

如果在服务器上的多个数据库中存在名称相同的对象? – 2014-09-18 19:04:34

+0

@TabAlleman,在这种情况下,我会输出这两个对象及其各自的数据库。换句话说,如果对象名称不是唯一的,我希望看到每个数据库中存在该对象。这应该是这种情况。无论如何,如果它发生,我只需要知道在哪里可以找到所有这些对象。 – RLH 2014-09-18 19:42:18

+0

我会回到创建几乎没用的列表的人,并询问它来自哪个数据库。如果它来自倍数,我会要求用足够的信息重新创建列表以使其有用。 – 2014-09-18 19:47:15

回答

1

我也有类似的问题,这是对我工作:

-- List of objects .. store in a table somewhere with 
-- a db column set to an empty string 
create table tempdb.dbo._mylist (name nvarchar(500), db nvarchar(500)) 
insert tempdb.dbo._mylist values ('obj 1', '') 
insert tempdb.dbo._mylist values ('obj 2', '') 

-- Setup cursor for databases 
DECLARE db_cursor CURSOR FOR 
    SELECT name from sys.databases WHERE [state] != 6 -- OFFLINE 

-- Loop through cursor 
OPEN db_cursor; 
DECLARE @dbname sysname; 
FETCH NEXT FROM db_cursor INTO @dbname; 
WHILE (@@FETCH_STATUS <> -1) 
BEGIN; 
    -- added dbname to object list if found (joined using common collation) 
    EXECUTE ('use ' + @dbname + '; update l set db = db + '';' + @dbname + ''' from tempdb.dbo._mylist l join sysobjects o on o.name = l.name COLLATE SQL_Latin1_General_CP1_CI_AS;'); 
    FETCH NEXT FROM db_cursor INTO @dbname; 
END; 
CLOSE db_cursor; 
DEALLOCATE db_cursor; 
GO 

-- Select results 
select name, db = isnull(stuff(db,1,1,''), '') from tempdb.dbo._mylist 

-- Cleanup 
drop table tempdb.dbo._mylist 
0

您可以使用SP_MSFOREACHDB存储过程编写脚本来执行此操作。你可以找到这个例子here这基本上允许你运行一个脚本对所有的数据库。

例如,下面的语句将允许您搜索表名,并且它还会返回关联的数据库名。

EXEC sp_Msforeachdb "USE [?]; SELECT '[?]' databaseName, * FROM sys.tables WHERE name = 'table_name'" 
+0

这个无证过程有一些严重的问题。在这里看看更好的选择。 http://sqlblog.com/blogs/aaron_bertrand/archive/2010/12/29/a-more-reliable-and-more-flexible-sp-msforeachdb.aspx – 2014-09-18 19:45:40

相关问题