2010-07-10 161 views
2

假設我有很多具有完全相同架構的sql服務器數據庫。有什麼地方可以寫一個存儲過程並申請所有數據庫嗎?如果我爲每個數據庫創建存儲過程,那麼在需要時,我必須全部更新它們。共享存儲過程

+2

您可以創建一個名爲「共享」,然後只把那些存儲的特效有使用'EXEC Shared.dbo.StoredProcName'執行它們單獨的數據庫 – 2010-07-10 06:41:37

回答

1

您遇到的問題是表綁定 - sproc如何知道要調用哪個數據庫?因此,您可能需要使用marc_s的註釋以及一些將數據庫名稱(和用戶名)傳遞給共享存儲過程的動態SQL。

create proc GetAllWidgets @dbname sysname, @owner nvarchar(100) 
as 
declare @sql nvarchar(4000) 
set @sql = 'select * from [' + @dbname + '].[' + @owner + '].Widget' 
sp_executesql @sql 
+1

謝謝你的答覆nswer。我實際上知道這樣做。我只是想我可能會錯過一些大的東西(比如可能通過擴展存儲過程或clr存儲過程等)。 – synergetic 2010-07-10 07:14:04

0

您可以使用中央管理服務器並同時針對多個服務器運行您的alter/create腳本。 See msdn

+0

因此,每個db仍然存儲一個proc,但我可以一次更新它們,對吧? – synergetic 2010-07-10 07:42:26

+0

是的。請參閱http://technet.microsoft.com/en-us/library/bb964743.aspx – SPE109 2010-07-10 11:40:13

6

您可以創建master,在如果sp前綴的存儲過程,當前數據庫上下文中運行存儲過程。這裏有一個例子:

USE master 
GO 
CREATE DATABASE Test1 --for demo purposes 
GO 
CREATE PROCEDURE dbo.sp_DoStuff 
AS 
SET NOCOUNT ON 
SELECT DB_NAME() 
GO 

USE Test1 
GO 
EXEC dbo.sp_DoStuff 
GO 

USE msdb 
GO 
EXEC dbo.sp_DoStuff 
GO 

USE master 
GO 
DROP DATABASE Test1 
DROP PROCEDURE dbo.sp_DoStuff 
GO 

這當然是你爲什麼不與正常啓動sp創建用戶存儲的特效...發動機試圖在主解析名稱

你可以依靠延遲名稱分辨率不扔你不存在的表的誤差在主

0
USE master; 
GO 
CREATE PROC dbo.sp_YourProc 
AS 
BEGIN 
    SET NOCOUNT ON; 
    SELECT DB_NAME()EXEC sys.sp_MS_marksystemobject 'ForEach'; 
END 
GO 
EXEC sys.sp_MS_marksystemobject 'sp_YourProc';