我的生产和开发(以及质量检查)数据库都有不同的名称。该应用程序使用视图来引用其他数据库中的表。我不想在每个源代码(开发,质量保证,生产)的源代码管理中使用单独的脚本,而是想创建一个“主”脚本(视图或函数?),该脚本将在所有脚本上运行,但将根据位置选择适当的数据库(当前数据库)。
类似的东西:
CASE db_name()
WHEN 'dev' THEN (SELECT a,b... FROM DEVSERVER.DEVOTHERDB.dbo.mytable)
WHEN 'prod' THEN (SELECT a,b... FROM PRODSERVER.PRODOTHERDB.dbo.mytable)
...
有什么想法吗?
答案 0 :(得分:0)
CASE
不能返回结果集,而只能返回一个值。
您可以做的是为每个数据库编写整个不同的SQL
declare @DBName varchar(100)
select @DBName = db_name()
if @DBName = 'dev'
begin
SELECT a,b... FROM DEVSERVER.DEVOTHERDB.dbo.mytable
end
else if @DBName = 'prod'
begin
SELECT a,b... FROM PRODSERVER.PRODOTHERDB.dbo.mytable
end
另一个选择是使用dynamic sql
declare @DBName varchar(100)
select @DBName = db_name()
declare @sql varchar(max)
if @DBName = 'dev'
begin
set @sql = 'SELECT a,b... FROM DEVSERVER.DEVOTHERDB.dbo.mytable'
end
else if @DBName = 'prod'
begin
set @sql = 'SELECT a,b... FROM PRODSERVER.PRODOTHERDB.dbo.mytable'
end
exec (@sql)
答案 1 :(得分:0)
大概,您要做的第一件事是
If Object_Id('dbo.CreateSynonym') Is Not Null Drop Procedure dbo.CreateSynonym
Go
Create Procedure dbo.CreateSynonym
@TableName SysName
As
Begin
Declare @Sql NVarchar(Max) = 'If Exists(Select * From sys.synonyms where name = ''' + @TableName + ''''
Exec (@Sql)
Set @Sql = 'Create Synonym dbo.' + @TableName + ' For ' +
Case When Db_Name() = 'dev' Then 'devserver.devdb'
When Db_Name() = 'prod' Then 'prodserver.proddb' End + '.dbo.' + @TableName
Exec (@Sql)
End
Go
Exec dbo.CreateSynonym 'mytable'
Exec dbo.CreateSynonym 'myothertable'
...
...
Go
(从我的头顶可能有疣)
从此以后,您只需引用dbo.MyTable
。