共享存储过程
您遇到的问题是表绑定 - 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
谢谢你的答复nswer。我实际上知道这样做。我只是想我可能会错过一些大的东西(比如可能通过扩展存储过程或clr存储过程等)。 – synergetic 2010-07-10 07:14:04
您可以使用中央管理服务器并同时针对多个服务器运行您的alter/create脚本。 See msdn
因此,每个db仍然存储一个proc,但我可以一次更新它们,对吧? – synergetic 2010-07-10 07:42:26
是的。请参阅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';
您可以创建一个名为“共享”,然后只把那些存储的特效有使用'EXEC Shared.dbo.StoredProcName'执行它们单独的数据库 – 2010-07-10 06:41:37