Я разрабатываю приложение, которое предоставит отдельную базу данных для каждого подписчика.Когда требуется новая база данных, запускается хранимый процесс на главной базе данных.Это создает новую базу данных и таблицы по умолчанию.Все идет нормально.Теперь мне нужно скопировать несколько сохраненных процедур из главной базы данных во вновь созданную базу данных.Я не хочу поддерживать скрипты или использовать сторонние инструменты, он должен быть динамическим.
Сейчас я беру содержимое SP из sql_modules, а затем пытаюсь выполнить его с новым db.Проблема в том, что я не знаю, как изменить базу данных, с которой работает exec (), база данных по умолчанию при запуске этого хранимого процесса - Master, мне нужно, чтобы она была целью.Я попытался изменить объявление процедуры на CREATE PROCEDURE [MyNewDb].[dbo].[AwesomeSP]
, но sql жалуется
«CREATE / ALTER PROCEDURE» не позволяет указывать имя базы данных в качестве префикса к имени объекта.
ОТВЕТ НА СЛЕДУЮЩИЙ:
Ааааа!Это оказалось проще, чем ожидалось, благодаря этой записи в блоге, найденной на kodyaz.com .Надеюсь, это поможет кому-то еще.
Вот код, который копирует все sp в базе данных Master в целевую базу данных, вы можете скопировать только те sp, которые вам нравятся, отфильтровав запрос по имени процедуры.
@sql
определяется как nvarchar(max)
@Name
- целевая база данных
Код:
DECLARE c CURSOR FOR
SELECT Definition
FROM [ResiDazeMaster].[sys].[procedures] p
INNER JOIN [ResiDazeMaster].sys.sql_modules m ON p.object_id = m.object_id
OPEN c
FETCH NEXT FROM c INTO @sql
WHILE @@FETCH_STATUS = 0
BEGIN
SET @sql = REPLACE(@sql,'''','''''')
SET @sql = 'USE [' + @Name + ']; EXEC(''' + @sql + ''')'
EXEC(@sql)
FETCH NEXT FROM c INTO @sql
END
CLOSE c
DEALLOCATE c