2009-10-19 56 views
0

我有一个sql server存储过程,用于在升级前从我们的数据库备份数据,我真的很喜欢它能够通过传入数据库名称作为参数来运行多个数据库上的存储过程。是否有捷径可寻?我能想到的最好的方法是在存储过程中动态构建sql,但感觉就像这是错误的做法。如何动态地在不同的数据库上运行SQL查询?

回答

1

没有任何其他的方式来做到这一点。动态SQL是唯一的方法;如果你已经有了严格的控制在DB的名称和谁在运行它,那么你没事只是截断一切融合在一起,但如果有任何疑问,使用QUOTENAME逃避安全参数:

CREATE PROCEDURE doStuff 
    @dbName NVARCHAR(50) 
AS 
    DECLARE @sql NVARCHAR(1000) 

    SET @sql = 'SELECT stuff FROM ' + QUOTENAME(@dbName) + '..TableName WHERE stuff = otherstuff' 

    EXEC sp_ExecuteSQL (@sql) 

显然,如果有什么事,更被穿过,然后你要仔细检查任何其他投入,并有可能使用参数化动态SQL,例如:

CREATE PROCEDURE doStuff 
    @dbName NVARCHAR(50) 
    @someValue NVARCHAR(10) 
AS 
    DECLARE @sql NVARCHAR(1000) 

    SET @sql = 'SELECT stuff FROM ' + QUOTENAME(@dbName) + '..TableName WHERE stuff = @pOtherStuff' 

    EXEC sp_ExecuteSQL (@sql, '@pOtherStuff NVARCHAR(10)', @someValue) 

这就可以确保为动态SQL参数传递通过安全和减少注射攻击的几率。它还提高了与查询关联的执行计划将被重用的机会。

0

个人而言,我只是用一个批处理文件,外壳SQLCMD这样的事情。否则,建立一个存储过程中的SQL(就像你说的)将工作得很好。不知道为什么这样做会是“错误的”。

最好的问候, 不要

0

MSSQL具有OPENQUERY(dbname,statement)函数,如果服务器已链接,则将其指定为第一个参数,并将该语句针对该服务器启动。

你可以生成一个动态Proc此OPENQUERY语句。并且它可以触发每个服务器上的备份过程,也可以直接执行该语句。

你使用SSIS吗?如果是这样,你可以尝试创建一对ssis包并尝试安排它们,或者远程执行它们。

2

构建备份当前数据库的过程,无论它是什么。在您要备份的所有数据库上安装此过程。

编写另一个将启动备份的过程。这取决于你没有提到的东西,比如你有一个包含每个备份数据库名称的表或者类似的东西。基本上所有你需要做的是遍历所有的数据库名称,并建立一个字符串,如:

SET @ProcessQueryString= 
    'EXEC '+DatabaseServer+'.'+DatabaseName+'.dbo.'+'BackupProcedureName param1, param2' 

,然后只是:

EXEC (@ProcessQueryString) 

远程运行它。

相关问题