2009-07-30 15 views
1

在一個SQL Server實例上運行一個存儲過程,我有以下數據庫:如何在多個數據庫

  • 總部
  • Branch001
  • Branch002
  • Branch003

...

  • 分公司NNN

每個分支DB是一個名爲usp_ComputeDailySales,做一些計算和寫每天的銷售數字,則Headquarters DB程序。如何在總部數據庫中編寫單個存儲過程以在所有分支數據庫中執行usp_ComputeDailySales

我可以寫下類似的代碼,但我認爲這不是要走的路。

USE Branch001 
EXEC usp_ComputeDailySales 

USE Branch002 
EXEC usp_ComputeDailySales 

... 

我想某種方式來同時執行所有分支數據庫的過程。

回答

2

這不是動態SQL,但依賴於類似延遲名稱解析。

EXECUTE,看到@module_name_var參數

DECLARE @sql varchar(300) 
SELECT 
    [name] + '..usp_ComputeDailySales' AS Cmd 
INTO #List 
FROM 
    sys.databases d WHERE d.[name] LIKE 'branch%' 
    OR --Thanks Mitch 
    d.[name] = 'Headquarters' 

WHILE EXISTS (SELECT * FROM #List) 
BEGIN 
    SELECT TOP 1 @SQL = Cmd FROM #List 
    EXEC @SQL 
    DELETE #List WHERE Cmd = @SQL 
END 

編輯,KM的評論後

是的,是有區別的,但我會澄清:

EXEC(@SQL)指@SQL可能'SELECT * FROM foo'或'DELETE User WHERE 1=1';。)

EXEC @SQL意味着@SQL是一個對象名稱。所以,我應該用@Obj

所以,你可以這樣做:

DECLARE @Obj varchar(200) 
SELECT @Obj = 'dbo.uspCustomHook' 
IF OBJECT_ID(@Obj) IS NOT NULL 
    EXEC @Obj @p1 = 1, @p2 = 'bob', ... 

它避免了延遲名稱解析錯誤。在編譯batch/proc時,如果dbo.uspCustomHook不存在,則不會出現錯誤。

自從SQL 2000以來,我還沒有使用這種技術,而且我不知道SQL 2005(語句級別的重新編譯)是否足夠聰明,如果應該運行@Obj,因爲它不存在,所以它不要嘗試編譯EXEC語句...

它對跨數據庫,相同的實例查詢也很有用。您可以配置prd-prod,dev-dev等,而不依賴於鏈接服務器或硬編碼數據庫名稱。

+1

..OR d。[name] ='總部'... – 2009-07-30 11:38:48

+0

+ 1。打我吧! ;) – 2009-07-30 11:39:21

+0

上週,我實際上正在研究幾乎完全一樣的東西。我使用了動態sql:_EXEC(@SQL)_,使用_EXEC @SQL_有什麼優勢或不同? – 2009-07-30 13:11:37

0

一個未公開的存儲過程只是他們的完全合格的名稱,如加以解決:

<Database Name>.<owner>.<table> 

和替換值。

例子:CustomerDatabase.dbo.Users

而在你的情況下,它看起來就像這樣:

exec Branch001.dbo.usp_ComputeDailySales 
exec Branch002.dbo.usp_ComputeDailySales 
exec Branch003.dbo.usp_ComputeDailySales 

這是假定一個用戶有權限的所有這些數據庫。

0

您可以使用sp_msForEachDB輕鬆完成此操作。第一個示例,這裏將每一個被命名爲LIKE「科%」數據庫上運行PROC:

EXECUTE sp_msForEachDB ' 
IF ''?'' like ''Branch%'' 
BEGIN 
    USE ? 
    EXECUTE usp_ComputeDailySales 
END 
' 

而這一次將每個數據庫上運行(無論名稱)該名稱包含一個存儲過程:

EXECUTE sp_msForEachDB ' 
USE ? 
IF object_id(''usp_ComputeDailySales'') is not null 
    EXECUTE usp_ComputeDailySales 
' 

與他們打個招呼 - 他們工作,但他們需要一點習慣。

補充說明:雖然這是一個「未公開的功能」,但它是自SQL Server 7.0以來的一個版本,可能更早。有許多文章和樣本可以使用它,也可能有許多依賴它的企業系統,其中一些已經建立。我真的從來沒有遇到過任何問題(一旦我得到了?和雙精度,就是這樣)。

相關問題