Создайте триггер для каждой таблицы в схеме с помощью процедуры sp_MSForEachTable - PullRequest
0 голосов
/ 09 июля 2020

Я пытаюсь создать сценарий на SQL Server 2017, который копирует значения из одной таблицы в другую в разных схемах, используя хранимую процедуру sp_MSForEachTable. Пока мне удалось получить строки, и когда я их распечатываю, он запускает запрос, который я ожидал, но вызывает проблемы, такие как

'CREATE TRIGGER' должен быть первым оператором в пакете запроса

и

Неправильный синтаксис рядом с 'GO'.

Основная структура кода c выглядит следующим образом:

EXEC sp_MSForEachTable 

@precommand = 'use bd1',

@command1 = 
'
DECLARE @tabla VARCHAR (MAX) = SUBSTRING(''?'', CHARINDEX(''.'', ''?'')+1, LEN(''?''));
SET @tabla = REPLACE(@tabla,''['','''');
SET @tabla = REPLACE(@tabla,'']'','''');
IF EXISTS (SELECT * FROM sys.objects WHERE [name] = N''TR_cloneField_''+@tabla+'''' AND [type] = ''TR'')
BEGIN
      DROP TRIGGER [prueba_bd].[TR_cloneField_''+@tabla+'']
END
',

@command2 = '
DECLARE @tabla VARCHAR (MAX) = SUBSTRING(''?'', CHARINDEX(''.'', ''?'')+1, LEN(''?''));
SET @tabla = REPLACE(@tabla,''['','''');
SET @tabla = REPLACE(@tabla,'']'','''');
PRINT(@tabla);
DECLARE @sql VARCHAR (MAX);
CREATE TRIGGER [TR_cloneField_''+@tabla+'']
ON ?
AFTER INSERT
AS
    BEGIN
        SET NOCOUNT ON
        SET @sql = ''
            INSERT INTO schema2.''+@tabla+''
                    (
                        [field1] ,
                        [field2] ,
                    )
            SELECT * FROM ?'';
        EXEC(@sql)
    END
GO
',

@whereand = 'and upper(schema_name(schema_id)) = ''schema2'''
GO

Я ценю любую помощь

РЕДАКТИРОВАТЬ: Спасибо, Билл.

Да, это была проблема. Будучи Т- SQL, я не мог поставить Go. Поэтому я поместил всю команду Trigger в динамик c T- SQL, и я запускаю ее только в каждом цикле.

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