Один из подходов, который может работать для вас, если у вас есть необходимые разрешения базы данных, заключается в использовании системной процедуры sp_helptext. При таком подходе вам не нужно разрабатывать приложение C#.
Первым шагом является создание временной базы данных, которая будет содержать сохраненное содержимое процедуры:
USE [master]
GO
CREATE DATABASE StoredProcBackup;
GO
USE [StoredProcBackup]
GO
CREATE TABLE StoredProcedures
(
[ProcedureName] NVARCHAR(200) Primary Key
,[ProcedureContent] NVARCHAR(MAX)
)
В приведенной выше таблице таблица StoredProcedures будет содержать имена и содержимое хранимых процедур, которые вы пытаетесь скриптом вне. Следующим шагом является создание курсора, который перечисляет процедуру и записывает содержимое в таблицу StoredProcedures во вновь созданной базе данных StoredProcBackup.
DECLARE @procedureName NVARCHAR(200) ;
DECLARE @procedureContent NVARCHAR(MAX);
DECLARE @procedureContentTable TABLE
(
[Text] NVARCHAR(MAX)
)
TRUNCATE TABLE [StoredProcBackup].[dbo].[StoredProcedures];
DECLARE procedure_cursor CURSOR FOR
SELECT ROUTINE_NAME
FROM information_schema.routines
WHERE routine_type = 'PROCEDURE';
OPEN procedure_cursor;
FETCH NEXT FROM procedure_cursor
INTO @procedureName;
WHILE @@FETCH_STATUS = 0
BEGIN
SET @procedureContent = '';
INSERT INTO @procedureContentTable
EXEC dbo.sp_helptext @procedureName;
select @procedureContent = coalesce(@procedureContent , '') + convert(NVARCHAR(MAX),[Text])
from @procedureContentTable;
DELETE @procedureContentTable;
INSERT INTO [StoredProcBackup].[dbo].[StoredProcedures]
(
[ProcedureName]
,[ProcedureContent]
)
VALUES
(
@procedureName
,@procedureContent
);
FETCH NEXT FROM procedure_cursor
INTO @procedureName;
END
CLOSE procedure_cursor;
DEALLOCATE procedure_cursor;
Теперь вы можете создать резервную копию базы данных «StoredProcBackup» и восстановить ее на локальном сервере. После того, как у вас есть копия на локальном сервере, вы можете просто запустить следующий скрипт для восстановления хранимых процедур.
USE [StoredProcBackup]
DECLARE @procedureContent NVARCHAR(MAX);
DECLARE create_procedure_cursor CURSOR FOR
SELECT [ProcedureContent]
FROM [dbo].[StoredProcedures]
OPEN create_procedure_cursor;
FETCH NEXT FROM create_procedure_cursor
INTO @procedureContent;
WHILE @@FETCH_STATUS = 0
BEGIN
EXEC (@procedureContent);
SET @procedureContent = '';
FETCH NEXT FROM create_procedure_cursor
INTO @procedureContent;
END
CLOSE create_procedure_cursor;
DEALLOCATE create_procedure_cursor;
Можете ли вы получить сценарии из своей системы управления версиями. Код базы данных должен находиться в исходном управлении, как и любой другой код. – HLGEM