如何在查询中不写入数据库名称的情况下访问不同的数

时间:2013-11-10 08:11:57

标签: sql-server database tsql deployment

如果我在Database1上创建了一个存储过程。并且查询正在访问Database2 生产环境没有相同的开发环境数据库名称 现在我必须检查每个过程,以便将Database2更改为Database_Prod2。

这很容易出错。我如何避免在查询中使用数据库名称。或者我如何避免这个部署问题,因为数据库名称必须不同?

SELECT *
FROM [dbo].[MyTable] tab1
INNER JOIN [DB2].[dbo].[MyOtherTable] tab2 ON tab1.ID = tab2.ID 

应改为

SELECT *
FROM [dbo].[MyTable] tab1
INNER JOIN [DB_Prod2].[dbo].[MyOtherTable] tab2 ON tab1.ID = tab2.ID 

2 个答案:

答案 0 :(得分:1)

根据预算/复杂程度,您可以使用此问题的许多解决方案。这些是我的最爱: -

  1. 在虚拟环境中复制您的实时环境,并针对“安全”副本进行编码。
  2. 使用视图将逻辑与表格隔离开来。可以从信息模式中非常轻松地创建这些视图,因此它们具有与基础表相同的结构。然后,您可以在任何“实时”数据库中定位视图。
  3. 为您的所有架构对象创建同义词,并且只对其进行编码。在部署解决方案时切换同义词的目标。 reference
  4. 复制您的环境是最灵活的解决方案 - 但它也是最复杂和最昂贵的解决方案。它使您有机会将开发人员与实时系统(认证?)和数据完全隔离开来。以可重复和可测试的方式打包部署的规则也是非常可取的。

    使用视图和同义词是一种更简单/更便宜的解决方案 - 但需要更多的纪律和代码审查等。

答案 1 :(得分:0)

使用动态声明:

CREATE PROC (@DBName varchar(100)
  --other params
)
AS 
BEGIN 
DECLARE @SQL VARCHAR(MAX) =''
SET @SQL =
'
SELECT *
FROM [dbo].[MyTable] tab1
INNER JOIN ['+@DBName+'].[dbo].[MyOtherTable] tab2 ON tab1.ID = tab2.ID 
'
EXEC(@SQL)
END