我继承了一个项目,每个“客户”都有自己的数据库。有数百个数据库。目前尚未使用存储过程。
此处使用数据的最佳做法是什么?我是否将存储过程保留在“主”数据库中并使用动态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但我无法正常工作。
答案 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_
为存储过程名称添加前缀,以便将它们识别为系统对象。
我希望这有助于某人。