我在哪裏我們有一個運行在大型機系統上的軟件包。大型機每晚轉儲到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查詢)。
我結束了一個非常類似於這個解決方案。 – 2009-02-04 18:11:17