2012-03-10 109 views
2

示例代码从不同数据库引用表,然后引用当前引用。引用T-SQL存储过程中的另一个数据库,而不对数据库名进行硬编码

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

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

这样的事(我知道这是行不通的,但也许它使我的问题更清晰)

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

回答

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)

+0

同义词的一个问题是,当你阅读代码时发生了什么并不明显。我想你可以通过命名约定来缓解这种情况。 – Andomar 2012-03-10 18:08:37

+0

我喜欢这个!谢谢Aaron! 一个问题 - 可以在链接服务器的表上创建同义词。即另一个数据库存在于不同的物理服务器上 – 2012-03-10 18:27:35

+1

是,CREATE SYNONYM dbo.foo FOR server.db.dbo.bar; – 2012-03-10 18:34:05

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) 
+1

如果我是你,我会在QuoteName函数中包围数据库名称 - http://msdn.microsoft.com/en-us/library/ms176114.aspx – Bridge 2012-03-10 17:34:40

+0

查看 - 是否会影响性能? - 查询视图时会使用表上的索引吗? – 2012-03-10 17:51:11

+0

视图在制定查询计划之前展开。因此,在查看视图时使用索引。 – Andomar 2012-03-10 18:07:31

相关问题