我需要将10000多个存储过程从客户端环境导入到我公司的环境中。
一种选择是创建一个基于C#的应用程序,用于创建这些10K以上的存储过程。
我知道DataSet、DataReader等,但我不知道如何实现它。
另一个选项-我使用ForEachLoop创建了一个SSIS包,从文件夹中获取文件,并使用Execute SQL Task在DB中加载/执行。这花费了太多时间(2000个文件=1小时)
你们能给我一些想法吗。。想法。。
要传输存储过程、函数、视图和许多其他对象类型,我会使用生成脚本向导。您可以使用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集合)。任意选择一些要放入给定文件中的过程,并遍历存储过程列表。一旦你在一个文件中放入了你想放入的数量,就增加文件名并继续编写脚本。