如何使用动态 SQL Server 数据库名称进行数据库间查询?

IT2*_*IT2 3 sql-server-2005 instance

我们有两台装有 SQL Server 2005 的数据库服务器,每台服务器有两个数据库。辅助服务器有两个 SQL Server 实例:一个用于开发,另一个用于报告。辅助服务器上的两个实例每天从主服务器恢复备份,但只有开发实例可以进行数据修改。

  • 这两个数据库来自不同的应用程序,但一个数据库具有更改另一个数据库上的数据的触发器。触发器更新第二个数据库硬编码其名称,如UPDATE database2..thetable

  • 一个数据库可以通过来自一个应用程序或存储过程的 SQL 查询从另一个数据库获取数据,硬编码为 SELECT FROM database2..thetable

我们正在考虑在辅助服务器(报告和开发)上加入两个 SQL Server 实例以简化管理和内存管理,但我找不到解决方案让触发器和存储过程动态地自动调用另一个数据库,并使用另一个名称使用相同的名称后缀。前任:

  • 实例:RS

    • DB1(使用 DB2..table 调用 DB2)
    • 数据库2
  • 实例:DEV

    • DB1(使用 DB2..table 调用 DB2)
    • 数据库2

进入:

  • 实例:默认
    • DB1_RS(使用 DB2_RS..table 调用 DB2_RS)
    • DB2_RS
    • DB1_DEV(使用 DB2_DEV..table 调用 DB2_DEV)
    • DB2_DEV

对此有哪些可能的解决方案?我可以考虑一些,但它们太复杂了:

  • 创建要通过 EXEC() 执行的动态 T-SQL。这让事情变得更加复杂,因为触发器有很多用于 UPDATES、INSERTS 和 DELETES 的代码。

  • 为每组数据库名称创建单独的触发器和存储过程(一个用于 DB1,另一个用于 DB1_DEV,另一个用于 DB1_RS)。这种方法似乎无法扩展......

  • 使查询中的数据库名称动态:INSERT INTO @db..table。不幸的是,SQL Server 不支持这个... :-(

有没有更简单有效的解决方案?

谢谢!

Aar*_*and 5

不确定我是否完全理解所有变量,但我怀疑您将能够使用两个环境之间不同的同义词,这将允许代码相同。这是一个抽象层,需要文档和/或额外的洋葱层才能剥皮,但绝对可以简化您编写的代码。这是CREATE SYNONYM主题...我已经广泛使用它们,所以如果您对它们有进一步的问题,请告诉我。