导入10000多个存储过程

本文关键字:存储过程 10000 导入 | 更新日期: 2023-09-27 17:59:49

我需要将10000多个存储过程从客户端环境导入到我公司的环境中。

一种选择是创建一个基于C#的应用程序,用于创建这些10K以上的存储过程。

我知道DataSet、DataReader等,但我不知道如何实现它。

另一个选项-我使用ForEachLoop创建了一个SSIS包,从文件夹中获取文件,并使用Execute SQL Task在DB中加载/执行。这花费了太多时间(2000个文件=1小时)

你们能给我一些想法吗。。想法。。

导入10000多个存储过程

要传输存储过程、函数、视图和许多其他对象类型,我会使用生成脚本向导。您可以使用SSMS在新环境中运行生成的脚本。

如果您拥有必要的数据库权限,一种可能适用于您的方法是使用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表将包含要编写脚本的存储过程的名称和内容。下一步是创建一个枚举过程的游标,并将内容写入新创建的StoredProcBackup数据库中的StoredPrograms表。

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;

您只需备份数据库并再次还原即可。数据库有多大?

您提到了C#,这是一个不错的方法。或者,更一般地说,MS提供了一个名为SMO(SQL管理对象)的.NET库,它使类似的事情不会那么糟糕。在对另一个答案的评论中,您提到了文件的大小。具体来说,我将查看Server和Database对象(以及后者的StoredProcedures集合)。任意选择一些要放入给定文件中的过程,并遍历存储过程列表。一旦你在一个文件中放入了你想放入的数量,就增加文件名并继续编写脚本。