2009-02-03 43 views
1

我在哪裏我們有一個運行在大型機系統上的軟件包。大型機每晚轉儲到SQL Server中,這樣我們的每個客戶端都有自己的服務器數據庫。服務器實例中還有一些其他數據庫,以及一些沒有數據的舊客戶端數據庫。與sp_msforeachdb類似的查詢幫助

我們經常需要在所有客戶端上運行報告或檢查數據。我希望能夠使用sp_msforeachdb或類似的東西運行查詢,但我不知道如何從列表中過濾不需要的dbs。有關這可能如何工作的任何想法?

我們仍然在SQL Server 2000上,但應該在幾個月內轉移到2005年。


更新:
我覺得我做的不好問這個問題,所以我要澄清我的目標,然後張貼我結束了使用的解決方案。

我想在這裏完成的工作是讓編程人員在他們的程序中使用查詢來使用一個客戶端數據庫編寫查詢,然後幾乎立即運行(測試)代碼,這些代碼被設計和構建在一個客戶端上分貝在所有50左右的客戶端數據庫,幾乎沒有修改。

考慮到這一點,這是我的代碼,因爲它目前在Management Studio(部分模糊)位於:

use [master] 
declare @sql varchar(3900) 

set @sql = 'complicated sql command added here' 

----------------------------------- 
declare @cmd1 varchar(100) 
declare @cmd2 varchar(4000) 
declare @cmd3 varchar(100) 
set @cmd1 = 'if ''?'' like ''commonprefix_%'' raiserror (''Starting ?'', 0, 1) with nowait' 
set @cmd3 = 'if ''?'' like ''commonprefix_%'' print ''Finished ?''' 
set @cmd2 = 
    replace('if ''?'' like ''commonprefix_%'' 
    begin 
     use [?] 
     {0} 
    end', '{0}', @sql) 

exec sp_msforeachdb @command1 = @cmd1, @command2 = @cmd2, @command3 = @cmd3 

關於這樣做的好處是所有你需要做的就是設置@sql變量設置爲查詢文本。很容易變成存儲過程。它是動態的sql,但它又是一次:它只用於開發(着名的遺言;))。缺點是你仍然需要跳過查詢中使用的單引號,並且很多時候你最終會在選擇列表中增加一個額外的''?'' As ClientDB列,但除此之外它可以工作得很好。

除非我今天又得到了一個非常好的主意,我希望將它變成一個存儲過程,並將一個版本作爲表值函數使用臨時表將所有結果放在一個結果集中(僅限select select查詢)。

回答

1

只是包裝你想在一個如果不是在執行語句:做這種類型的事情

EXEC sp_msforeachdb " 
IF  '?'  NOT IN ('DBs','to','exclude') BEGIN 
     EXEC sp_whatever_you_want_to 
END 
" 
+0

我結束了一個非常類似於這個解決方案。 – 2009-02-04 18:11:17

0

我們的每個數據庫服務器都包含一個「DBA」數據庫,其中包含充滿這種元數據的表格。

A「數據庫」表將保留在服務器上的所有數據庫的列表,你可以把標誌列指示數據庫狀態(活,歸檔,系統等)。

然後,您的SCRIPT所做的第一件事就是到您的DBA數據庫以獲取它應該運行的所有數據庫的列表。

我們甚至有一個夜間維護腳本,確保物理服務器上的所有數據庫也進入了我們的「DBA.databases」表,並提醒我們,如果他們沒有。 (因爲添加一行到這個表應該是一個手動過程)

0

如何採取sp_msforeachdb的定義,並調整到適合你的目的是什麼?爲了讓您可以運行這個定義(按Ctrl-T第一次把結果窗格爲文本模式):

sp_helptext sp_msforeachdb 

很明顯,你會想創建自己的這個存儲過程的版本,而不是覆蓋原來的;○ )

0

是在2005年SSIS包很簡單。也許你可以在某個服務器上設置一個實例。

我們設置了多臺服務器,所以我們有一張表格來表示將要測量的服務器。然後,我們退回所有數據庫的列表。這用於備份腳本。

您可以維護這個數據庫列表並添加一些用於您自己目的的字段。你可以有另一個軟件包或步驟,具體取決於你如何決定要報告哪些數據庫以及是否可以通過編程方式完成。 http://www.sqlmag.com/Articles/ArticleID/97840/97840.html?Ad=1

我們根據我們的系統上運行此代碼:

你可以在這裏的代碼是免費的。