在以下情况下,我尝试将数百个过程导入其他数据库。

解决方案:SQL Server

资源

  • 服务器:A
  • 数据库:苹果
  • 程序:SP1,SP2,SP3 ... SP100

目的地

  • 服务器:B
  • 数据库:橙色

与两个数据库相比,我所做的第一件事就是发现仅不存在的过程。

为此,我使用了每个数据库中的INFORMATION_SCHEMA.ROUTINES并在Excel中进行了比较。

找到要导入的过程列表之后,我想一次导入所有过程。

但是,如果我在单行文本中创建过程,它将被保存为可见性为零的一行。

因此,我使用sp_helptext逐行复制。 然后,创建如下所示的小查询:

create table #proceduretext (runquery varchar(max))
insert into #proceduretext
exec sp_helptext 'SP1'
insert into #proceduretext select 'go'
insert into #proceduretext
exec sp_helptext 'SP2'
insert into #proceduretext select 'go'
insert into #proceduretext
exec sp_helptext 'SP3'
insert into #proceduretext select 'go'
.
.
.
insert into #proceduretext
exec sp_helptext 'SP100'
insert into #proceduretext select 'go'

然后从临时表中进行选择,粘贴结果,然后运行。

但是,上述仍然不足。

请帮助以下问题:

  1. 有没有办法对链接服务器使用INFORMATION_SCHEMA.ROUTINES

  2. 如果对问题1有答案,如何在下面的查询中循环查找所有缺少的过程?

     insert into #proceduretext exec sp_helptext 'SP100' insert into #proceduretext select 'go' 

#1楼 票数:0

尝试使用https://www.red-gate.com/比较工具,您可以下载追踪版本。 效果很好

#2楼 票数:0 已采纳

您可以使用链接服务器轻松完成此操作。 这是我为您准备的示例。 从目标数据库中运行它,然后将[GREGT580]更改为链接服务器的名称。

USE tempdb;
GO

-- Copying from [GREGT580] to local server

SET NOCOUNT ON;

DECLARE @MissingProcedures TABLE
(
    MissingProcedureID int IDENTITY(1,1) PRIMARY KEY,
    SchemaName sysname,
    ProcedureName sysname,
    ProcedureDefinition nvarchar(max)
);

INSERT @MissingProcedures 
(
    SchemaName, ProcedureName, ProcedureDefinition
)

SELECT s.[name], p.[name], sm.definition
FROM [GREGT580].AdventureWorks.sys.procedures AS p
INNER JOIN [GREGT580].AdventureWorks.sys.schemas AS s
ON p.schema_id = s.schema_id
INNER JOIN [GREGT580].AdventureWorks.sys.sql_modules AS sm
ON sm.object_id = p.object_id 
WHERE NOT EXISTS (SELECT 1 
                  FROM sys.procedures AS pl
                  INNER JOIN sys.schemas AS sl
                  ON sl.schema_id = pl.schema_id
                  AND sl.[name] = s.[name] COLLATE DATABASE_DEFAULT 
                  AND pl.[name] = p.[name] COLLATE DATABASE_DEFAULT);

DECLARE @SchemaName sysname;
DECLARE @ProcedureName sysname;
DECLARE @ProcedureDefinition nvarchar(max);
DECLARE @Counter int = 1;

WHILE @Counter < (SELECT MAX(MissingProcedureID) FROM @MissingProcedures AS mp)
BEGIN
    SELECT @SchemaName = mp.SchemaName,
           @ProcedureName = mp.ProcedureName,
           @ProcedureDefinition = mp.ProcedureDefinition
    FROM @MissingProcedures AS mp
    WHERE mp.MissingProcedureID = @Counter;

    PRINT @ProcedureDefinition; -- Change to EXEC (@ProcedureDefinition) to create

    SET @Counter += 1;
END;

我使代码只是打印出过程,因此您可以对其进行测试。 当您要实际创建它们时,将PRINT行更改为显示的EXEC选项。 (请注意,如果PRINT较长,则PRINT将截断显示的内容,但EXEC可以)。

希望对您有帮助。

  ask by vay translate from so

未解决问题?本站智能推荐:

1回复

存储过程循环

我有一个存储过程,该存储过程基于3个参数生成一些xml:@ property_id,@ property_component_id和@return_as_xml。 @return_as_xml的值对于所有记录都是相同的,为0。 我已对此进行了修改,现在需要根据特定条件(即活动和租赁属性)
1回复

带有 OUTPUT 参数的存储过程的 CURSOR

我必须一次向表中插入一条记录,然后通过传递输出变量来执行存储过程。 插入部分实际上做到了这一点,我在目标表中看到了两条不同的记录。 但是存储过程似乎使用了为插入到目标表中的第一条记录传递的相同输出参数。 所以基本上当一个存储过程被循环调用时,对于插入到目标表中的每个不同的 ID,一遍又一遍地重复相
1回复

SQL Server 2014存储过程很慢

我有一个存储过程来计算收据,直到今天我对它没有任何问题,直到必须在具有100000行的数据库中执行它为止。 它太慢了,至少要运行3个小时,并且尚未完成。 有没有办法对此进行优化? 这里的代码: 再次感谢!!
2回复

执行CSV中每行的存储过程

我试图在查询中多次使用tsql运行存储过程,使用每个CSV行作为参数。 我将如何循环这个? 干杯
3回复

除了在循环中执行存储过程,还有其他更有效的选择吗?

我在asp.net站点的webforms中调用了许多存储过程,并循环执行。 在大多数情况下,这很好,除非我要使用大量产品。 事情真的很慢。 有没有其他办法可以使我的网站更有效? 例如,我有一个存储过程spReservePart ,它执行以下操作: 它来自的Web窗体具有一个带
1回复

将 select 语句的结果作为参数传递给存储过程

我有一个存储过程,它执行各种检查并将值插入到多个表中。 我还有一个返回大约 600 行的 select 语句。 输出: 我基本上希望我的存储过程从 select 语句中获取值,将它们作为参数输入并执行。 基本上它将运行大约 600 次或基于选择的行数。 我怎样才能做到这一点? 我正在
1回复

SQL Server,使用特定字段值按列调用存储过程

我有一个表BounceStatistics与列: Email_Address , Bounces , Status , Week , Year 我有一个名为GetStatus的存储过程,具有以下参数Email_address , Week和Year 。 该过程填充从另一组表中收集的Bou
2回复

存储过程-在没有游标的情况下循环搜索结果

我环顾四周,我发现为了遍历结果,您必须使用游标,并且在同一篇文章中有人说游标不好,不要使用它们(这一直是我的理念),但现在我陷入了困境。 我需要遍历结果集! 这是情况。 我需要拿出一个ProductID列表,该列表将2种不同的状态设置为一个特定值。 我启动存储过程,运行查询以查找符合