跨数据库SQL脚本

时间:2009-07-07 09:35:22

标签: sql sql-server database

我正在开展一个项目,我们直接从一个数据库与另一个数据库进行对话。我们有一个主数据库,客户端更新其网站,然后通过大量SQL脚本将更改从一个数据库推送到另一个数据库。 master数据库用作预览站点,允许他们在推送更改之前查看更改。

目前我们将slave数据库名称直接编码为SQL查询。

e.g。 INSERT INTO [slave-database] .dbo.TableName

这是一个绝对的痛苦,但是当我们开发我们将拥有多组两个数据库的开发时。任何与正在进行的开发相关的存储过程都被更新以指向该特定分支的从属数据库,例如[branch5从站 - 数据库]。

这并不理想,因为在推入主干时需要手动调整更改(更改硬编码的数据库名称)。

有更好的方法吗?我目前唯一能看到的解决方案是为每个分支创建一个SQL Server实例,这意味着数据库名称在所有分支中始终保持不变。这将是一个绝对的痛苦,并将有相当大的开销。是否可以在SQL Server中为数据库名称设置常量?允许我们只更新分支数据库上的单个值。动态SQL是不可能的。

4 个答案:

答案 0 :(得分:1)

看一下使用未记录的系统存储过程sp_MSforeachdb

sp_MSforeachdb

它允许您处理当前实例中每个数据库的代码。您可以使用。

明确地排除系统数据库

答案 1 :(得分:0)

某些DBMS方言允许在连接时使用数据库别名打开数据库。 这为您提供了表别名或列别名在SQL的其他部分中执行的一些灵活性。

在这种情况下,无论实际连接字符串是什么,您都可以使用数据库别名“slave”发出连接。然后,您不必将实际的从属数据库名称编码为查询。但是,您必须连续管理打开和关闭各种从属设备,以避免名称“奴隶”发生冲突。

另一种选择是使用表格链接,如果你的方言支持它们。你将在避免碰撞方面遇到类似的问题。

答案 2 :(得分:0)

您可以使用动态Sql更改从属数据库的名称。例如:

declare @query nvarchar(4000)
set @query = 'INSERT INTO [' + @slavedbname + '].dbo.TableName ...'
exec sp_executesql @query

您可以将从属DB的名称存储在表格中并从那里检索它:

select @slavedbname = value from Settings where name = 'SlaveDbName'

或者你可以有一个约会,它等于当前数据库加_slave:

select @slavedbname = db_name() + '_slave'

答案 3 :(得分:0)

使用动态生成的Sql排序(如@Andomar建议的那样),无法在SQL中参数化运行时的数据库名称​​

但是,当您执行DDL来构建数据库时,您有许多更多选项。可能最简单的方法是使用SQLCmd参数语法,在执行构建脚本时提供从属数据库名称作为参数(请参阅SQLCmd doco)。然后可以将其合并到您的构建/部署脚本中,以便可以轻松地自动执行给定环境的架构构建。我在过去完全按照你描述的方案做了这个。

最终,最好的答案可能是将内容迁移完全从数据库中移出,并将其放入应用程序层。这通常是一种更清洁的方法,并且带来了额外的好处,因为两个数据库的位置不再重要(例如,它们可能位于单独的服务器上)。只有你可以根据自己的需要决定这是否过度。