从T-SQL存储过程引用另一个数据库,而不对数据库名称进行硬编码

Gre*_*icz 2 t-sql sql-server sql-server-2005

示例代码引用来自不同数据库的表,然后是当前的.

use DB1
select * from SomeTableInDB1
select * from DB2..SomeTableInDB2
Run Code Online (Sandbox Code Playgroud)

问题:其他数据库("DB2")的名称可以以某种方式进行软编码吗?

像这样的东西(我知道这不会起作用,但也许这会让我的问题更加清晰)

use DB1
varchar @OtherDB
set @OtherDB = "DB2"
select * from SomeTableInDB1
select * from @OtherDB..SomeTableInDB2
Run Code Online (Sandbox Code Playgroud)

Aar*_*and 8

您还可以使用同义词,我发现它比视图更清晰(视图不应该有,SELECT *但也需要在基础表更改时进行维护).

USE DB1;
GO
CREATE SYNONYM dbo.SomeTableInDB2 FOR DB2.dbo.SomeTableInDB2;
Run Code Online (Sandbox Code Playgroud)

这实际上只是一个重定向 - 来自基表的索引仍以相同的方式使用等等.所以现在在DB1中你可以说:

SELECT * FROM dbo.SomeTableInDB2;
Run Code Online (Sandbox Code Playgroud)

...没有硬编码数据库.

有关更多信息,请参阅CREATE SYNONYM(MSDN).

  • @Andomar:我喜欢将同义词放在一个不同的模式中,该模式仅用于该数据库的同义词.例如,假设我有db_a需要有db_b和db_c的同义词.在db_a中,我将创建模式db_b和db_c,并将db_b的同义词放在模式db_b中,同样也用于db_c.现在,在读取代码时,当您在模式db_b中看到"对象"时,它们是外部引用. (2认同)