Копирование нескольких хранимых процедур в другую базу данных. - PullRequest
0 голосов
/ 19 сентября 2019

В приведенном ниже сценарии я пытаюсь импортировать сотни процедур в другую базу данных.

Решение: SQL Server

Источник

  • СЕРВЕР: A
  • БАЗА ДАННЫХ: Apple
  • ПРОЦЕДУРЫ: SP1, SP2, SP3 ... SP100

Направление

  • СЕРВЕР: B
  • БАЗА ДАННЫХ: Orange

Первым делом я нашел только несуществующие процедуры по сравнению с обеими базами данных.

Для этого я использовал 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'
    

Ответы [ 2 ]

0 голосов
/ 19 сентября 2019

Вы можете сделать это с помощью связанного сервера довольно легко.Вот пример, который я подготовил для вас.Запустите его из целевой базы данных и измените [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;

Я сделал код, просто распечатав процедуры, чтобы вы могли проверить его.Измените строку ПЕЧАТЬ на параметр EXEC, показанный, когда вы хотите создать их.(Обратите внимание, что PRINT будет обрезать то, что показывает, если они длинные, но EXEC будет в порядке).

Надеюсь, это поможет вам.

0 голосов
/ 19 сентября 2019

попробуйте использовать https://www.red -gate.com / инструмент сравнения, вы можете скачать версию трассы.Прекрасно работает

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...