Я хотел бы записать 'универсальный' сценарий для работы в ряде баз данных. 'Использование databasename' команды будет распределено в теле сценария. Я показал бы информацию об имени базы данных наверху сценария. Так идеально:
declare @db varchar(100) set @db = 'data_in' use @db
Это перестало работать. Так, возможно,
declare @db varchar(100) set @db = 'data_in' exec ('use '+@db)
Это выполняется, но по-видимому изменяет базу данных только в контексте запроса в строке.
Так есть ли какой-либо другой путь, не помещая целый сценарий в строку и выполняя его тот путь т.е. средство исправления, хуже, чем болезнь?
Ознакомьтесь с переменными сценария в SQLCMD .
Это позволяет вам помещать переменные в ваши сценарии в форме:
USE $(db1_name)
...some code...
USE $(db2_name)
...some code...
И значения переменных интерполируются из среды переменные, параметры, предоставляемые во время выполнения, или жестко заданные значения.
Эд уже упоминал 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)
Примечания:
Если вы пойдете по этому маршруту, я настоятельно рекомендую использовать уникальный префикс который идет вверх, например sp_ @ yourproc, а не sp_yourproc, чтобы вы могли найти их позже, и другие люди знали, что это нечто особенное.
После того, как процедура помечена как системная, ее нельзя обновить. Чтобы внести изменения, вы должны отбросить, воссоздать и отметить как систему.
Не делайте этого, если вы не знаете, что делаете, и не провели еще немного исследований. Не делайте этого, если вы не боитесь риска. Не делайте этого, если у вас нет экземпляра для разработки, который нужно сначала протестировать.
Сделайте резервную копию UDSSP в файл или CSV. Обновление сервера может уничтожить их.
Вы можете ] НЕ поместите оператор использования в свой сценарий и предоставьте базу данных с помощью команды osql (или любой другой, которую вы используете), например:
osql -S servername -d databasename -U username -P password -i script.sql
Думаю, ваша презумпция верна; Вчера у меня была такая же проблема. Я решил это, поместив команды в одну строку. Почему вам не нравится это решение?