Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 进口10000+;存储过程_C#_Sql Server_Ssis - Fatal编程技术网

C# 进口10000+;存储过程

C# 进口10000+;存储过程,c#,sql-server,ssis,C#,Sql Server,Ssis,我需要将10000多个存储过程从客户机环境导入到我公司的环境中 一种选择是创建一个基于C#的应用程序来创建这些10K+存储过程 USE [StoredProcBackup] DECLARE @procedureContent NVARCHAR(MAX); DECLARE create_procedure_cursor CURSOR FOR SELECT [ProcedureContent] FROM [dbo].[StoredProcedures] OPEN create_p

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

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

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;
我有数据集、数据阅读器等方面的知识,但我不知道如何实现这一点

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


所以,你们能给我一些想法…想法..

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

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

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

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

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

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

如果你有必要的数据库权限,一种可能适合你的方法是使用“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数据库中的StoredProcedures表

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;

如果您具有必要的数据库权限,一种可能适用于您的方法是使用“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数据库中的StoredProcedures表

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;

谢谢Joe,但我发现这样产生的脚本太大了。当我尝试这种方法&从客户机复制.SQL文件并在本地ssm中打开时,系统挂起。此外,当我们在SSMS中打开太大的文件时,几乎没有危险/疑问,该文件可能无法完全加载/打开。所以我正在寻找另一种选择。有人建议尝试在SSIS中传输数据库对象。但该任务只在2 DB之间传输对象,我们不能将源连接作为文件类型连接。谢谢Joe,但我发现这样生成的脚本太大了。当我尝试这种方法&从客户机复制.SQL文件并在本地ssm中打开时,系统挂起。此外,当我们在SSMS中打开太大的文件时,几乎没有危险/疑问,该文件可能无法完全加载/打开。所以我正在寻找另一种选择。有人建议尝试在SSIS中传输数据库对象。但是该任务仅在2 DB之间传输对象,我们不能将源连接作为文件类型连接。由于隐私和安全原因,我们不能使用这种方法。那么,没有相关表的存储过程有什么用呢?你不能运行它。我不认为您可以在数据库之间传输存储的proc,因为存储的proc作为元数据存储在数据库中。如中所述,由于隐私和安全原因,我们不能使用这种方法。那么,没有相关表的存储过程有什么用呢?你不能运行它。我不认为您可以在数据库之间传输存储的proc,因为存储的proc作为元数据存储在数据库中。如中所述,您可以从其源代码管理系统获取脚本。数据库代码应该像其他代码一样在源代码管理中。你能从他们的源代码管理系统中获取脚本吗。数据库代码应该像其他代码一样在源代码管理中。非常感谢Edmond。你没问多少问题就给了我一个很好的解决方案。我得到了与上面类似的想法,但由于时间限制,我创建了SSIS包&我正在使用该包部署单个SSIS