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