Sql server 连接来自不同数据库的两个表的最佳方法是什么?

Sql server 连接来自不同数据库的两个表的最佳方法是什么?,sql-server,tsql,Sql Server,Tsql,连接来自不同数据库的两个表的最佳方法是什么?在我的情况下,我有一个开发数据库,它有后缀,比如_DEV,而在生产中有_PROD 问题是,如果我连接这两个表,我必须引用完整的数据库名称,例如DB1_DEV.dbo.table1 internal join DB2_DEV.dbo.table100 工作虽然很好,但如果你想把它投入生产,这将是一个夜间维修,因为我必须改变这些 谢谢这里有一个建议:将Dev和Prod数据库移动到具有相同名称的不同服务器集群 如果您不能或不愿这样做,我建议您在查询中找到一些

连接来自不同数据库的两个表的最佳方法是什么?在我的情况下,我有一个开发数据库,它有后缀,比如_DEV,而在生产中有_PROD

问题是,如果我连接这两个表,我必须引用完整的数据库名称,例如DB1_DEV.dbo.table1 internal join DB2_DEV.dbo.table100

工作虽然很好,但如果你想把它投入生产,这将是一个夜间维修,因为我必须改变这些


谢谢

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

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

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

-- 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
编辑:您可以定义相关表的同义词。在查询表的任何位置使用同义词而不是全名


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

根据您的情况,同义词可能是最佳答案,也可能是视图

视图示例:

CREATE VIEW table1 AS SELECT * FROM DB1_DEV.dbo.table1
稍后,当您移动到PROD时:

ALTER VIEW table1 AS SELECT * FROM DB1_PROD.dbo.table1
就像使用同义词一样,更新神奇地修复了所有引用表1的查询

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


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


然后,当您转到PROD时,您不必更改任何内容。

这也是我使用的方法,但我使用AdventureWorksProductionProduct的命名法,将整个限定名称填充为同义词名称。您使用规范的db名称作为名称,而不是物理名称,因此无论引用的物理db是什么,完整的同义词都是有意义的。将它们放在两个不同的位置并使用相同的名称是唯一的解决方案,或者每个查询都是动态sql,这只是一个等待发生的意外。