Программно установить имя таблицы в предложении FROM - PullRequest
0 голосов
/ 23 октября 2018

Есть ли способ программно установить имена таблиц, используемые в предложении FROM?

Причина в том, что у нас есть разные имена таблиц в нашей среде prod vs. dev, поэтому нам нужно соответствующим образом установить имена таблицдля использования в наших отчетах, основанных на различных средах.

Например:

В prod имя базы данных 123prd, в dev это будет 123dev

В prod имя базы данных 456prd, в dev это 456dev

Отчет выполняется для базы данных 123prd, и нам нужно INNER JOIN присоединиться к другой таблице в базе данных 456prd.

Таким образом, для среды Prod это будет примерно так:

USE 123prd
SELECT * 
FROM aTable a 
JOIN 456prd.dbo.bTable b 
ON a.id = b.id

Однако, поскольку отчет должен работать правильно в соответствии с другой средой Prod vs. Dev, мне нужно будет программно изменитьимя базы данных в предложении FROM.

Так вот что у меня есть:

DECLARE @456DBName VARCHAR(16)
SET @456DBName = REPLACE(DB_NAME(), '123', '456')

USE 123prd
SELECT * 
FROM aTable a 
JOIN CONCAT(@456DbName, '.dbo.bTable') b 
ON a.id = b.id

Я получил неверный синтаксис ошибки при использовании CONCAT или + Есть ли правильный способ, как сделать связанныйсервер программно?Кстати, извините за плохой английский, надеюсь, мой вопрос имеет смысл.

Ответы [ 3 ]

0 голосов
/ 23 октября 2018

Вы можете выполнять запросы к нескольким серверам, используя «группы серверов» в ssms. https://docs.microsoft.com/en-us/sql/ssms/register-servers/execute-statements-against-multiple-servers-simultaneously?view=sql-server-2017

0 голосов
/ 23 октября 2018

Вариант 1. Вы можете сделать это с помощью кода, используя разные методы в зависимости от переменной среды и вызывая разные процедуры хранения или разные схемы с одинаковыми именами.

Вариант 2. Вы можете использовать динамические запросы.Вы можете создать таблицу для управления конфигурацией, какую схему / таблицу использовать в зависимости от параметра, отправляемого с вашего сервера.Затем просто выполните динамический запрос.

Т.е..

DECLARE @Prefix VARCHAR(10) = 'dev';

DECLARE @Params NVARCHAR(200) = '@Prefix VARCHAR(10)'
     , @Query  NVARCHAR(MAX) = 'SELECT [Id] FROM [Schema].['+@Prefix+'TableName]';

EXECUTE [sp_executesql]
 @Query ,
 @Params ,
 @Prefix = @Prefix
0 голосов
/ 23 октября 2018

У вас есть ограниченные возможности, потому что вы не можете просто установить проект таким образом.

Один из вариантов - отказаться от именования из трех частей.Просто ссылки на таблицы внутри базы данных.Это работает, если производство / разработка состоит только из одной базы данных.

Другой вариант - заключить все ссылки в представления (они могут также включать бизнес-логику).Это особенно полезно, если «производство» и «разработка» могут охватывать несколько баз данных.Представления могут находиться в одном месте, но, вероятно, их необходимо создавать с использованием сценариев развертывания, использующих динамический SQL.

Для связанной опции используются синонимы.Я лично не использовал их для этой цели, но они должны работать.

И, наконец, существует динамический SQL.Один из способов - сохранить запросы и сделать замену хранимой процедурой.Черт возьми, вы могли бы даже сохранить запросы как представления для конкретной базы данных - и иметь хранимую процедуру для замены других сред.

...