Изменения оператора представления SQL / выбора функции на основе соединения с базой данных - PullRequest
0 голосов
/ 03 июля 2019

У меня есть ситуация, когда мои базы данных производства и разработки (и QA тоже) имеют разные имена. Приложение использует Views для ссылки на таблицы в других базах данных. Вместо того, чтобы иметь отдельные сценарии в управлении исходным кодом для каждого (dev, qa, production), я хотел бы создать один «главный» сценарий (представление или функцию?), Который будет работать на всех, но будет выбирать из соответствующей базы данных на основе где ( текущая база данных) она запускается из.

Что-то вроде:

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 голосов
/ 03 июля 2019

Грубо говоря, первое, что вы запускаете, это

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.

0 голосов
/ 03 июля 2019

A 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

другой вариант использует динамический 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...