SQL视图/函数选择语句基于数据库连接的更改

时间:2019-07-03 13:12:08

标签: sql-server

我的生产和开发(以及质量检查)数据库都有不同的名称。该应用程序使用视图来引用其他数据库中的表。我不想在每个源代码(开发,质量保证,生产)的源代码管理中使用单独的脚本,而是想创建一个“主”脚本(视图或函数?),该脚本将在所有脚本上运行,但将根据位置选择适当的数据库(当前数据库)。

类似的东西:

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)
...

有什么想法吗?

2 个答案:

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