我们在这里专门使用存储过程,这引起了一些问题。我们交叉引用两个不同的数据库,如dev中的dbdev..table1,qa中的dbqa..table1和生产中的dbprod..table1。
因此,每次我们部署到不同的环境时,我们都必须从dbdev搜索并替换为dbqa或dbprod。
有没有办法使用同义词或任何sql server机制来解决问题?
答案 0 :(得分:3)
使用sqlcmd变量,这些变量由.sql配置脚本的sqlcmd部署支持,以及VSDB项目。因此,您的配置脚本如下所示:
create procedure usp_myProc
as
select .. from [$(crossdb)]..table1;
go
在生产中部署时,您运行sqlcmd /E /I provisoning.sql /v crossdb=dbprod
,而QA部署将通过sqlcmd /E /I provisioning.sql /v crossdb=dbqa
完成。请参阅Using sqlcmd with Scripting Variables。
作为旁注,我正在开发一个允许从.Net SqlClient(SqlConnection,SqlCommand)使用sqlcmd变量的项目:dbutilsqlcmd项目。
答案 1 :(得分:2)
SQL Server 2005支持同义词,因此您可以创建synonym1以在dev环境中引用dbdev..table1,在prod环境中引用dbprod..table1。您的SP(可能还有视图)只对同义词进行操作。
更新
最简单创建同义词的方式:
exec sys.sp_MSforeachtable
'print ''CREATE SYNONYM '' + REPLACE(''?'', ''].['', ''].[syn_'') +
'' FOR [my_database].?
GO'''
(GO之前有一个换行符)
运行并将结果粘贴到新的查询窗口中。
答案 2 :(得分:1)
答案 3 :(得分:1)
动态sql
(原谅潜在的错别字,但概念就在那里)
Declare @dbname nvarchar(255), @sql nvarchar(max)
set @dbname = 'db1'
Set @sql = 'Select * From ' + @dbname + '.dbo.table1'
exec sp_executesql @sql
答案 4 :(得分:0)
您可以将数据库名称作为存储过程的参数,然后使用Dynamic SQL构建查询。
例如:
CREATE PROC MyStoredProcedure @DBName VARCHAR(50)
AS
DECLARE @SQL VARCHAR(MAX)
SET @SQL = 'SELECT * FROM ' + @DBName + '.dbo.table1'
EXEC sp_executesql @SQL
然后,您只需使用适当的DB名称调用存储过程:
EXEC MyStoredProcedure 'dbdev'