Sql 共享存储过程

Sql 共享存储过程,sql,sql-server,tsql,stored-procedures,Sql,Sql Server,Tsql,Stored Procedures,假设我有许多sql server数据库具有完全相同的模式。是否有任何地方可以编写存储过程并应用于所有数据库?如果我为每个数据库创建存储过程,在需要时,我必须将它们全部更新。您将遇到的问题是表绑定--存储过程如何知道要调用哪个数据库?因此,您可能希望使用marc_s的注释加上一些动态SQL,将数据库名称(和用户名)传递给共享存储过程 create proc GetAllWidgets @dbname sysname, @owner nvarchar(100) as declare @sql nva

假设我有许多sql server数据库具有完全相同的模式。是否有任何地方可以编写存储过程并应用于所有数据库?如果我为每个数据库创建存储过程,在需要时,我必须将它们全部更新。

您将遇到的问题是表绑定--存储过程如何知道要调用哪个数据库?因此,您可能希望使用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

您可以使用中央管理服务器,同时对多台服务器运行alter/create脚本。

如果在存储过程前面加上
sp
,则可以在
master
中创建一个在当前数据库上下文中运行的存储过程。下面是一个例子:

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
…来创建用户存储的进程的原因。。。引擎将尝试解析master中的名称


您可以依靠延迟名称解析来避免对master中不存在的表抛出错误

您可以创建一个名为“Shared”的单独数据库,然后将这些存储的过程放在那里,并使用exec Shared.dbo.StoredProcName执行它们谢谢您的回答。我其实知道这种做法。我只是觉得我可能遗漏了一些重要的东西(比如可能通过扩展存储过程或clr存储过程等),所以,每个数据库仍然有一个存储过程,但我可以一次更新它们,对吗?
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';