共享存储过程

时间:2010-07-10 06:37:21

标签: sql sql-server tsql stored-procedures

假设我有许多具有完全相同架构的sql server数据库。有没有可以编写存储过程并申请所有数据库的地方?如果我为每个数据库创建存储过程,则需要时,我必须全部更新它们。

4 个答案:

答案 0 :(得分: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 ...引擎尝试解析主站中的名称

您可以依赖延迟名称解析来不为主

中不存在的表引发错误

答案 1 :(得分:1)

你将遇到的问题是表绑定 - sproc如何知道要调用哪个数据库?因此,您可能希望使用 marc_s 的注释以及一些动态SQL,您可以将数据库名称(和用户名)传递给共享的sproc。

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

答案 2 :(得分:0)

您可以使用中央管理服务器并同时针对多个服务器运行alter / create脚本。See msdn

答案 3 :(得分: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';