从不同数据库连接2个表的最佳方法是什么?

时间:2009-06-08 21:12:45

标签: sql-server tsql

从不同数据库加入2个表的最佳方法是什么?在我的情况下,我有一个开发数据库,​​它具有postfix,例如_DEV,而在生产中有_PROD。

问题是,如果我加入这两个表,我必须引用一个完整的数据库名称,例如DB1_DEV.dbo.table1 INNER JOIN DB2_DEV.dbo.table100

虽然工作得很好但是如果你想将它投入生产,那将是一个噩梦,因为我必须改变这些。

谢谢

4 个答案:

答案 0 :(得分:10)

您可以使用 Synonyms 来简化查询。例如:

-- Create a synonym for the Product table in AdventureWorks.
USE tempdb;
GO
CREATE SYNONYM MyProduct
FOR AdventureWorks.Production.Product;
GO

-- Query the Product table by using the synonym.
USE tempdb;
GO
SELECT ProductID, Name FROM MyProduct WHERE ProductID < 5;
GO

编辑:您可以为相关表格定义同义词。在查询表的任何位置使用同义词而不是全名。

部署到生产环境时,您所要做的就是更改同义词。

答案 1 :(得分:2)

根据您的具体情况,SYNONYM可能是最佳答案,也可能是VIEW。

使用VIEW的示例:

CREATE VIEW table1 AS SELECT * FROM DB1_DEV.dbo.table1

稍后,当您转到PROD时:

ALTER VIEW table1 AS SELECT * FROM DB1_PROD.dbo.table1

就像使用SYNONYM一样,该更新神奇地修复了所有仅涉及“table1”的查询。

以下是解释同义词和观点之间差异的讨论:

What are the pros/cons of using a synonym vs. a view?

答案 2 :(得分:1)

以下是一个建议:将您的Dev和Prod数据库移动到具有相同名称​​的不同服务器群集

如果您不能或不会这样做,我建议您找到一些方法来在查询中参数化您的数据库名称。

答案 3 :(得分:0)

您必须将您的架构名称存储在数据库中的某个位置。获取该模式名称并构建动态sql。并使用oracle内部包DBMS_SQL.EXECUTE()来执行您的选择查询。

然后当你转移到PROD时,你不必改变任何东西。