В SQL-сервере есть ли способ получить команду «использовать базу данных» для принятия переменной - PullRequest
9 голосов
/ 09 июня 2009

Я хотел бы написать «общий» скрипт для работы с несколькими базами данных. Команды 'use databasename' будут распространяться в теле скрипта. Я бы предпочел показать информацию об имени базы данных вверху скрипта. Так что в идеале:

declare @db varchar(100)
set @db = 'data_in'
use @db

Это не удалось. Так что возможно

declare @db varchar(100)
set @db = 'data_in'
exec ('use '+@db)

Это выполняется, но предположительно изменяет базу данных только в контексте запроса в строке.
Так есть ли другой способ, не помещая весь скрипт в строку и не выполняя его таким образом, т.е. лекарство хуже болезни?

Ответы [ 4 ]

5 голосов
/ 09 июня 2009

Проверьте переменные сценариев в SQLCMD .

Это позволяет вам помещать переменные в ваши скрипты в виде:

USE $(db1_name)
...some code...

USE $(db2_name)
...some code...

И иметь значения переменных, интерполированные из переменных среды, параметров, предоставляемых во время выполнения, или жестко заданных значений.

2 голосов
/ 09 июня 2009

Эд уже упоминал SQLCMD, очень хороший выбор для сценариев.

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

Пользовательская системная хранимая процедура (UDSSP) создается в базе данных master с префиксом «sp_» и помечается как системный объект с недокументированным системным proc sp_MS_marksystemobject (SQL2005).

Он берет свой контекст базы данных из текущего соединения или трехчастное имя, если оно так называется.

Пример вызова:

declare @db sysname
declare @sql nvarchar(max)
set @db = 'yourdatabase'
set @sql = 'exec '+quotename(@db)+'..sp_@yourproc'
exec (@sql)

Примечания:

  1. Если вы пойдете по этому пути, я настоятельно рекомендую использовать уникальный префикс, который сортирует по верху, например sp_ @ yourproc, а не sp_yourproc, чтобы вы могли найти их снова позже, и другие люди знают, что они являются чем-то специальный.

  2. Как только процедура помечена как системная, она не может быть обновлена. Чтобы внести изменения, вы должны удалить, воссоздать и отметить как системный.

  3. Не делайте этого, если вы не знаете, что делаете, и не проделали больше исследований. Не делайте этого, если вы склонны к риску. Не делайте этого, если у вас нет экземпляра разработки для тестирования вначале.

  4. Резервное копирование UDSSP в файл или CSV. Обновление сервера может уничтожить их.

1 голос
/ 09 июня 2009

Я думаю, что ваша презумпция права; У меня была такая же проблема вчера. Я решил это, поместив команды в одну строку. Почему вам не нравится это решение?

1 голос
/ 09 июня 2009

Вы можете НЕ добавить оператор использования в ваш скрипт и предоставить базу данных командой osql (или чем-то еще, что вы используете) следующим образом:

osql -S servername -d databasename -U username -P password -i script.sql
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...