对一百个相同的数据库使用一组存储过程

时间:2012-01-18 05:02:18

标签: database tsql procedure

我继承了一个项目,每个“客户”都有自己的数据库。有数百个数据库。目前尚未使用存储过程。

此处使用数据的最佳做法是什么?我是否将存储过程保留在“主”数据库中并使用动态SQL来处理数据?似乎应该有一个更好的方法。我不希望有一个工作来推动数百个DB的存储过程,以保持所有存储过程同步。

这个动态SQL正在运行,但我想要一个更好的方法。

CREATE PROCEDURE [Users_SELECT] 
@DataBase nvarchar(20),
@UserID uniqueidentifier
AS
BEGIN
DECLARE @sql nvarchar(max)
SET @sql = ''
SET @sql += 'SELECT * FROM ' + @DataBase + '.dbo.Users u '
SET @sql += 'WHERE u.UserID=@UserID '
EXEC sp_executesql @sql, N'@UserID uniqueidentifier', @UserID
END

我尝试EXEC sp_executesql 'USE ' + @DataBase + '; GO'然后运行SELECT但我无法正常工作。

2 个答案:

答案 0 :(得分:1)

我没有看到将存储过程部署到每个数据库有什么问题。

您还必须将更改部署到架构,因此您希望有适当的基础架构来自动执行此操作。如果不是时间构建基础设施。

答案 1 :(得分:0)

我明白了。这可能会让SQL专家非常生气,但我对解决方案感到满意。

我在'master'中创建了我的存储过程。我知道这通常是禁忌。然后我用

USE master
EXEC sys.sp_MS_marksystemobject [sp_Users_SELECT]
GO

将每个sproc标记为系统对象。通过这种方式,可以在不同的上下文中调用它们。我可以这样做:

USE DataBase200
EXEC sp_Users_SELECT

它将在DataBase200数据库的上下文中运行,而不必将sproc实际部署到该数据库。到目前为止它工作得很好。请记住,您必须使用sp_为存储过程名称添加前缀,以便将它们识别为系统对象。

我希望这有助于某人。