Как иметь имя базы данных в качестве переменной в SP? - PullRequest
0 голосов
/ 26 августа 2010

Мы используем хранимые процедуры исключительно здесь, и это поднимает небольшую проблему.Мы производим перекрестные ссылки на две разные базы данных, такие как dbdev..table1 в dev, dbqa..table1 в qa и dbprod..table1 в рабочей среде.

Таким образом, каждый раз, когда мы развертываем в другой среде, мы должны искать и заменять dbdev на dbqa или dbprod.

Есть ли способ использовать синоним или любую другую механику сервера sql для решения проблемы?

Ответы [ 5 ]

3 голосов
/ 26 августа 2010

Используйте переменные sqlcmd, которые поддерживаются развертыванием sqlcmd сценариев обеспечения .sql, а также проектами VSDB. Итак, ваш сценарий инициализации выглядит так:

create procedure usp_myProc
as
select .. from [$(crossdb)]..table1;
go

При развертывании в рабочей среде вы запускаете sqlcmd /E /I provisoning.sql /v crossdb=dbprod, а развертывание QA будет осуществляться через sqlcmd /E /I provisioning.sql /v crossdb=dbqa. См. Использование sqlcmd с переменными сценариев .

В качестве примечания я работаю над проектом, который позволяет использовать переменные sqlcmd из .Net SqlClient (SqlConnection, SqlCommand): проект dbutilsqlcmd .

2 голосов
/ 26 августа 2010

SQL Server 2005 поддерживает синонимы, поэтому вы можете создать synonym1 для ссылки на dbdev..table1 в среде dev и на dbprod..table1 в среде prod.Ваши SP (и, вероятно, просмотры) просто работают с синонимами.

Обновление:

Самый простой способ создания синонимов:

exec sys.sp_MSforeachtable 
    'print ''CREATE SYNONYM '' + REPLACE(''?'', ''].['', ''].[syn_'') + 
    '' FOR [my_database].?
    GO'''

(перед GO есть разрыв строки)

Запустите и вставьте результат в новое окно запроса.

1 голос
/ 26 августа 2010

Динамический sql

(простите за потенциальные опечатки, но концепция есть)

Declare @dbname nvarchar(255), @sql nvarchar(max)
set @dbname = 'db1'

Set @sql = 'Select * From ' + @dbname + '.dbo.table1'
exec sp_executesql @sql
1 голос
/ 26 августа 2010

Нет.

Невозможно создать синоним для базы данных.Это популярный запрос .

Действительно ли необходимо переименовать ваши базы данных для dbdev, dbqa, dbprod и т. Д.?

0 голосов
/ 26 августа 2010

Вы можете использовать имя базы данных в качестве параметра вашей хранимой процедуры, а затем использовать Dynamic SQL для построения ваших запросов.

Пример:

CREATE PROC MyStoredProcedure @DBName VARCHAR(50) 
AS

   DECLARE @SQL VARCHAR(MAX)
   SET @SQL = 'SELECT * FROM ' + @DBName + '.dbo.table1'
   EXEC sp_executesql @SQL

Тогда вы просто вызовете свою хранимую процедуру.процедура с соответствующим именем БД:

EXEC MyStoredProcedure 'dbdev'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...