【问题标题】:SQL View / Function Select statement changes based on Database ConnectionSQL View/Function Select 语句根据数据库连接变化
【发布时间】:2019-07-03 22:05:58
【问题描述】:

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

类似:

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

有什么想法吗?

【问题讨论】:

  • 数据库同义词有时会在这种情况下有所帮助——或者使问题变得更糟。在 Azure SQL 世界中 - 跨数据库或切换数据库/目录实际上不起作用。
  • "应用程序使用视图来引用其他数据库中的表" 您真的需要将生产数据库与开发数据库链接吗?这听起来不对。您应该使用相同的视图并连接到不同的数据库。
  • @EzLo 我试图避免为单独的数据库使用单独的脚本。由于 servername.databasename 组合,每种情况下的 SQL 都不同。

标签: sql-server


【解决方案1】:

大致来说,你运行的第一件事是

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

【讨论】:

    【解决方案2】:

    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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-17
      • 1970-01-01
      • 1970-01-01
      • 2020-04-04
      • 2015-07-06
      • 1970-01-01
      相关资源
      最近更新 更多