共享存储过程

问题描述:

假设我有很多具有完全相同架构的sql服务器数据库。有什么地方可以写一个存储过程并申请所有数据库吗?如果我为每个数据库创建存储过程,那么在需要时,我必须全部更新它们。共享存储过程

+2

您可以创建一个名为“共享”,然后只把那些存储的特效有使用'EXEC Shared.dbo.StoredProcName'执行它们单独的数据库 – 2010-07-10 06:41:37

您遇到的问题是表绑定 - 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

您可以使用中央管理服务器并同时针对多个服务器运行您的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

您可以创建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创建用户存储的特效...发动机试图在主解析名称

你可以依靠延迟名称分辨率不扔你不存在的表的误差在主

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';