如何在SP中将数据库名称作为变量?

时间:2010-08-26 18:07:04

标签: sql-server database

我们在这里专门使用存储过程,这引起了一些问题。我们交叉引用两个不同的数据库,如dev中的dbdev..table1,qa中的dbqa..table1和生产中的dbprod..table1。

因此,每次我们部署到不同的环境时,我们都必须从dbdev搜索并替换为dbqa或dbprod。

有没有办法使用同义词或任何sql server机制来解决问题?

5 个答案:

答案 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)

没有

无法为数据库创建同义词。那是popular request

是否真的有必要为dbdevdbqadbprod等重命名数据库?

答案 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'