SQL Server 2008 R2 - программно копировать хранимую процедуру из одной базы данных в другую - PullRequest
1 голос
/ 08 марта 2012

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

Сейчас я беру содержимое 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

Ответы [ 2 ]

0 голосов
/ 04 ноября 2016

Это работает для меня:

set @ script = @ destDB + '. Dbo.sp_executesql N' '' + @ spDefenition + '' '' * * *

exec sp_executesql @ script

0 голосов
/ 08 марта 2012

Что будет работать, так это выполнить dbname.dbo.sp_executesql N'CREATE PROCEDURE ... '. Таким образом, вы можете построить строку, которая делает все это. Вы можете заменить свой SET @sql = 'Use ... на:

set @sql = N'execute ' + QUOTENAME(@name) + N'.dbo.sp_executesql N''' + @sql + ''''
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...