Установить имя базы данных динамически в хранимой процедуре SQL Server? - PullRequest
4 голосов
/ 15 января 2010

Как динамически установить имя базы данных в хранимой процедуре SQL Server?

Ответы [ 3 ]

15 голосов
/ 16 января 2010

Иногда использование SYNONYMs является хорошей стратегией:

CREATE SYNONYM [schema.]name FOR [[[linkedserver.]database.]schema.]name

Затем обратитесь к объекту по его синониму в вашей хранимой процедуре.

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

Эта функция доступна только в SQL Server 2005 и более поздних версиях.

Этот метод НЕ подходит для частого переключения или для ситуаций, когда разные соединения должны использовать разные базы данных. Я использую его для базы данных, которая иногда перемещается между серверами (она может работать в базе данных prod или в базе данных репликации, и у них разные имена). Восстановив базу данных в ее новом доме, я запустил на ней свой Switcheroo SP, и все работает примерно за 8 секунд.

10 голосов
/ 15 января 2010

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

Declare @strSQL VarChar (MAX)
Declare @DatabaseNameParameter VarChar (100) = 'MyOtherDB'

SET @strSQL = 'SELECT * FROM ' + @DatabaseNameParameter + '.Schema.TableName'

Вы можете использовать операторы if, чтобы установить @DatabaseNameParameter в нужную вам БД.

Выполните инструкцию, чтобы получить результаты.

3 голосов
/ 15 января 2010

Это не динамический SQL и работает для хранимых процедур

Declare @ThreePartName varchar (1000)
Declare @DatabaseNameParameter varchar (100)

SET @DatabaseNameParameter = 'MyOtherDB'

SET @ThreePartName = @DatabaseNameParameter + '.Schema.MyOtherSP'

EXEC @ThreePartName @p1, @p2...   --Look! No brackets
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...