C# 进口10000+;存储过程
我需要将10000多个存储过程从客户机环境导入到我公司的环境中 一种选择是创建一个基于C#的应用程序来创建这些10K+存储过程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
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