如果我在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
答案 0 :(得分:1)
根据预算/复杂程度,您可以使用此问题的许多解决方案。这些是我的最爱: -
复制您的环境是最灵活的解决方案 - 但它也是最复杂和最昂贵的解决方案。它使您有机会将开发人员与实时系统(认证?)和数据完全隔离开来。以可重复和可测试的方式打包部署的规则也是非常可取的。
使用视图和同义词是一种更简单/更便宜的解决方案 - 但需要更多的纪律和代码审查等。
答案 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