2016-08-02 3 views
0

Мне нужно импортировать 10 000+ хранимых процедур из среды клиентов в среду моей компании.Импорт 10 000+ хранимых процедур

Одним из вариантов является создание приложения на основе C#, которое создает эти хранимые процедуры 10K +.

У меня есть знания DataSet, DataReader и т. Д., Но я не знаю, как это реализовать.

Другой вариант. Я создал пакет SSIS с использованием ForEachLoop, беря файлы из папки и загружая/выполняя в БД с помощью задачи Execute SQL. Это занимает слишком много времени (2000 файлов = 1 час)

Так вы, ребята, дайте мне ... некоторые thoughts..ideas ..

+0

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

ответ

1

Для передачи хранимых процедур, функций, представлений и многих других типов объектов I будет использовать мастер создания скриптов. Вы можете запускать сгенерированные скрипты в новой среде с помощью SSMS.

+0

Спасибо Джо, но я обнаружил, что в этом случае результирующий скрипт слишком большой. Когда я попробовал этот подход и скопировал файлы .SQL с клиентского компьютера и открыл его в моей локальной SSMS, система получила зависание. Также есть небольшая опасность/сомнение, когда мы открываем слишком большой файл в SSMS, этот файл может не загружаться/открываться полностью. Поэтому я ищу другую альтернативу. –

+0

Кто-то предложил попробовать для передачи объектов базы данных в SSIS. Но эта задача переносит объекты только между двумя БД, мы не можем передать исходное соединение как соединение типа File. –

0

Вы можете просто создать резервную копию базы данных и восстановить ее снова. Насколько велика база данных?

+0

Из-за соображений конфиденциальности и безопасности мы не можем использовать этот подход. –

+0

Итак, каково использование хранимой процедуры без соответствующих таблиц? вы не можете запустить его.Я не думаю, что вы можете просто передать хранимую передачу между базами данных, потому что хранимая proc хранится в метаданных в базе данных. Как упоминалось в http://stackoverflow.com/questions/18240194/how-to-script-out-stored-procedures-to-files – cungiderm

0

Вы упомянули C#, и это не плохой подход. Или, в более общем плане, MS предоставляет библиотеку .NET, называемую SMO (объекты управления SQL), которая делает такие вещи не такими уж плохими. В комментарии к другому ответу вы указали размер файла. В частности, я бы рассмотрел объекты Server и Database (и коллекция StoredProcedures для последней). Произвольно выбирайте несколько процедур, которые вы хотите поместить в данный файл, и перебирайте список хранимых процедур. После того, как вы вложили столько, сколько хотите добавить в один файл, увеличьте имя файла и сохраните скрипты.

+0

Большое спасибо. Вы дали мне хорошее решение, не задавая много вопросов. У меня была аналогичная мысль, как и выше, и я тоже пытался, но почему-то возникла проблема с DLL, связанной с SMO. Из-за ограничений по времени я создал пакет SSIS & using, что я развертываю отдельные хранимые процедуры (в .SQL-файле) в базу данных назначения. –

+0

Нет проблем. Я знаю, что изучение SMO дало мне лучшее представление о том, как вещи изложены в базе данных. Поэтому, хотя ваша проблема решена, потратить некоторое время на изучение этого не будет потрачено впустую. –

0

Один из подходов, который может работать для вас, если у вас есть необходимые разрешения базы данных, заключается в использовании системной процедуры 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; 
+0

Большое спасибо Эдмонду. Вы дали мне хорошее решение, не задавая много вопросов. Я получил аналогичную мысль, как описано выше, но из-за ограничений по времени я создал пакет SSIS & using, что я развертываю отдельные хранимые процедуры (в .SQL-файле) в целевую БД. –

Смежные вопросы