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

时间:2012-03-10 17:04:23

标签: sql-server sql-server-2005 tsql

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

use DB1
select * from SomeTableInDB1
select * from DB2..SomeTableInDB2

问题:其他数据库(“DB2”)的名称能否以某种方式进行软编码?

这样的事情(我知道这不起作用,但也许这会让我的问题更清楚)

use DB1
varchar @OtherDB
set @OtherDB = "DB2"
select * from SomeTableInDB1
select * from @OtherDB..SomeTableInDB2

2 个答案:

答案 0 :(得分:8)

您还可以使用同义词,我发现它比视图(view shouldn't have SELECT *更干净,但在底层表更改时也需要维护。)

USE DB1;
GO
CREATE SYNONYM dbo.SomeTableInDB2 FOR DB2.dbo.SomeTableInDB2;

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

SELECT * FROM dbo.SomeTableInDB2;

...没有对数据库进行硬编码。

有关详细信息,请参阅CREATE SYNONYM (MSDN)

答案 1 :(得分:2)

您可以使用界面视图,因此您只需在一个位置更改数据库名称:

create view vw_Db2If_SomeTable
as
select * from DB2.dbo.SomeTable

另一个选项是动态SQL:

declare @sql nvarchar(max)
set @sql = 'select * from ' + @OtherDB + '.dbo.SomeTable'
exec (@sql)