Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
跨数据库SQL脚本_Sql_Sql Server_Database - Fatal编程技术网

跨数据库SQL脚本

跨数据库SQL脚本,sql,sql-server,database,Sql,Sql Server,Database,我正在做一个项目,我们直接从一个数据库到另一个数据库进行对话。我们有一个主数据库,客户端在其中更新其网站,然后通过大量SQL脚本将更改从一个数据库推送到另一个数据库。主数据库作为一个预览站点,允许他们在将更改推到活动状态之前查看更改 目前,我们将从数据库名称直接编码到SQL查询中 e、 g.插入[从数据库].dbo.TableName 然而,当我们将开发扩展到两个数据库的多个集合时,这绝对是一件痛苦的事情。与正在进行的开发相关的任何存储过程都会更新,以指向该特定分支的从属数据库,例如[branc

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

目前,我们将从数据库名称直接编码到SQL查询中

e、 g.插入[从数据库].dbo.TableName

然而,当我们将开发扩展到两个数据库的多个集合时,这绝对是一件痛苦的事情。与正在进行的开发相关的任何存储过程都会更新,以指向该特定分支的从属数据库,例如[branch5从属数据库]

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


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

看看如何使用未记录的系统存储过程sp_MSforeachdb


它允许您针对当前实例中的每个数据库处理代码。如果使用,可以显式排除系统数据库。

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

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


另一种选择是使用表链接,如果您的方言支持的话。在避免冲突方面,您将面临类似的问题。

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

declare @query nvarchar(4000)
set @query = 'INSERT INTO [' + @slavedbname + '].dbo.TableName ...'
exec sp_executesql @query
您可以将从属数据库的名称存储在表中,然后从表中检索:

select @slavedbname = value from Settings where name = 'SlaveDbName'
或者您可以有一个约定,其中它等于当前数据库加上_slave:

select @slavedbname = db_name() + '_slave'

在某种程度上,使用动态生成的Sql(正如@Andomar所建议的),在Sql中无法在运行时参数化数据库名称

但是,当您执行DDL来构建数据库时,您有更多的选项。可能最简单的方法是使用SQLCmd参数语法,在执行构建脚本时提供从属数据库名称作为参数(请参阅)。然后可以将其合并到构建/部署脚本中,这样就可以轻松地自动化为给定环境构建模式。我在过去做过这件事,几乎和你描述的场景一样


最终,最好的解决方案可能是将内容迁移从数据库中完全移除,并将其放入应用程序层。这通常是一种更干净的方法,并且会带来额外的好处,因为两个数据库的位置不再重要(例如,它们可能位于不同的服务器上)。只有您才能决定这是否满足您的需要。

我找到的最佳选择是SQL Server 2005同义词。它们不能在数据库级别使用,所以我为数据库之间引用的每个对象都有一个。然后,我将编写一个脚本,它可以用不同的数据库名称快速重建同义词。