Я пытаюсь создать сценарий на 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, и я запускаю ее только в каждом цикле.