我有一个sql server存储过程,用于在升级前从我们的数据库备份数据,我真的很喜欢它能够通过传入数据库名称作为参数来运行多个数据库上的存储过程。是否有捷径可寻?我能想到的最好的方法是在存储过程中动态构建sql,但感觉就像这是错误的做法。如何动态地在不同的数据库上运行SQL查询?
0
A
回答
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)
远程运行它。
相关问题
- 1. 动态SQL - 根据参数查询不同的数据库
- 2. 在不同的数据库中运行相同的查询
- 3. 如何告诉IntelliJ在不同的数据库上运行查询?
- 4. 在我的DMZ后面的数据库上运行SQL查询
- 5. 同时在多个数据库上运行SQL状态?
- 6. 如何在Go中的Neo4j数据库上运行Cypher查询?
- 7. Ansible Playbook将在Postgres SQL数据库实例上运行查询
- 8. 如何在EF上运行SQL查询?
- 9. 根据动态HTML下拉列表运行不同的查询
- 10. 如何在ms访问中运行不同的数据库查询表格
- 11. 数据库连接建立后如何运行SQL查询?
- 12. 无法动态运行SQL查询
- 13. 运行动态SQL查询从常规
- 14. sql查询动态地影响多行
- 15. 如何在SQL Server 2008上执行SQL Server 2005生成的数据库查询?
- 16. 如何自动运行SQL查询?
- 17. 如何运行sql查询从不同的joomla组件返回数据
- 18. 如何使用jQuery进行动态数据库查询?
- 19. 如何查看数据库上当前正在运行的查询
- 20. 多个数据库上的SQL查询
- 21. 动态地进行查询
- 22. 如何在Spark Streaming中异步地在流数据上定义的表上运行SQL查询?
- 23. 如何使用Java在不同线程或不同进程上运行不同的sql查询
- 24. 如何查询SQL Server数据库?
- 25. SQL Server - 动态数据透视查询
- 26. 如何在SQL中查询有两种不同情况的数据库?
- 27. 如何在Hibernate中使用CreateSqlQuery查询不同的数据库?
- 28. 如何使用线程在XNA中运行数据库查询?
- 29. 如何在名称包含空格的数据库上运行查询?
- 30. Symfony - 在数据库不可用时记录可运行的本地查询