В SQL-сервере там любой способ заставить 'команду' базы данных использования принимать переменную

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

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

Это перестало работать. Так, возможно,

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

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

9
задан Cade Roux 9 June 2009 в 17:42
поделиться

4 ответа

Ознакомьтесь с переменными сценария в SQLCMD .

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

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

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

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

5
ответ дан 4 December 2019 в 21:51
поделиться

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

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

Определяемая пользователем системная хранимая процедура (UDSSP) создается в основной базе данных с префиксом "sp_" и помечен как системный объект недокументированной системной процедурой 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. Обновление сервера может уничтожить их.

2
ответ дан 4 December 2019 в 21:51
поделиться

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

osql -S servername -d databasename -U username -P password -i script.sql
1
ответ дан 4 December 2019 в 21:51
поделиться

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

1
ответ дан 4 December 2019 в 21:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: