我有一個超過200個數據庫對象的列表。所有這些都是表,存儲過程和視圖。如果給出SQL Server對象的列表,如何確定每個對象駐留在哪個數據庫中?
所有這些對象存在一個特定的SQL Server上,但我並沒有給出一個字段中指定該數據庫中的每個對象的歸屬。
考慮到特定服務器上的某個地方存在數據庫對象的列表,怎麼能我查詢服務器爲每個對象提供包含的數據庫名稱?
我有一個超過200個數據庫對象的列表。所有這些都是表,存儲過程和視圖。如果給出SQL Server對象的列表,如何確定每個對象駐留在哪個數據庫中?
所有這些對象存在一個特定的SQL Server上,但我並沒有給出一個字段中指定該數據庫中的每個對象的歸屬。
考慮到特定服務器上的某個地方存在數據庫對象的列表,怎麼能我查詢服務器爲每個對象提供包含的數據庫名稱?
我也有類似的問題,這是對我工作:
-- 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
您可以使用SP_MSFOREACHDB存儲過程編寫腳本來執行此操作。你可以找到這個例子here這基本上允許你運行一個腳本對所有的數據庫。
例如,下面的語句將允許您搜索表名,並且它還會返回關聯的數據庫名。
EXEC sp_Msforeachdb "USE [?]; SELECT '[?]' databaseName, * FROM sys.tables WHERE name = 'table_name'"
這個無證過程有一些嚴重的問題。在這裏看看更好的選擇。 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
如果在服務器上的多個數據庫中存在名稱相同的對象? – 2014-09-18 19:04:34
@TabAlleman,在這種情況下,我會輸出這兩個對象及其各自的數據庫。換句話說,如果對象名稱不是唯一的,我希望看到每個數據庫中存在該對象。這應該是這種情況。無論如何,如果它發生,我只需要知道在哪裏可以找到所有這些對象。 – RLH 2014-09-18 19:42:18
我會回到創建幾乎沒用的列表的人,並詢問它來自哪個數據庫。如果它來自倍數,我會要求用足夠的信息重新創建列表以使其有用。 – 2014-09-18 19:47:15