dynamique de l'erreur sql: 'CREATE TRIGGER" doit être la première instruction dans un traitement de requêtes

Dans le cadre de certaines tâches administratives, nous avons un grand nombre de tables que chaque besoin d'un déclencheur créé. Le déclenchement de définir un indicateur et la date dans la base de données d'Audit lorsqu'un objet a été modifié. Pour des raisons de simplicité, j'ai un tableau avec tous les objets qu'il déclenche créé.

Je suis en train de générer le sql dynamique pour ce faire, pour chaque objet, mais j'obtiens cette erreur:
'CREATE TRIGGER' must be the first statement in a query batch.

Voici le code pour générer le sql.

CREATE PROCEDURE [spCreateTableTriggers]
AS
BEGIN
DECLARE @dbname     varchar(50),
@schemaname varchar(50),
@objname    varchar(150),
@objtype    varchar(150),
@sql        nvarchar(max),
@CRLF       varchar(2)
SET     @CRLF = CHAR(13) + CHAR(10);
DECLARE ObjectCursor CURSOR FOR
SELECT  DatabaseName,SchemaName,ObjectName
FROM    Audit.dbo.ObjectUpdates;
SET NOCOUNT ON;
OPEN    ObjectCursor ;
FETCH NEXT FROM ObjectCursor
INTO    @dbname,@schemaname,@objname;
WHILE @@FETCH_STATUS=0
BEGIN
SET @sql = N'USE '+QUOTENAME(@dbname)+'; '
SET @sql = @sql + N'IF EXISTS (SELECT * FROM sys.triggers WHERE object_id = OBJECT_ID(N'''+QUOTENAME(@schemaname)+'.[Tiud_'+@objname+'_AuditObjectUpdates]'')) '
SET @sql = @sql + N'BEGIN DROP TRIGGER '+QUOTENAME(@schemaname)+'.[Tiud_'+@objname+'_AuditObjectUpdates]; END; '+@CRLF
SET @sql = @sql + N'CREATE TRIGGER '+QUOTENAME(@schemaname)+'.[Tiud_'+@objname+'_AuditObjectUpdates] '+@CRLF
SET @sql = @sql + N'   ON '+QUOTENAME(@schemaname)+'.['+@objname+'] '+@CRLF
SET @sql = @sql + N'   AFTER INSERT,DELETE,UPDATE'+@CRLF
SET @sql = @sql + N'AS '+@CRLF
SET @sql = @sql + N'IF EXISTS(SELECT * FROM Audit.dbo.ObjectUpdates WHERE DatabaseName = '''+@dbname+''' AND ObjectName = '''+@objname+''' AND RequiresUpdate=0'+@CRLF
SET @sql = @sql + N'BEGIN'+@CRLF
SET @sql = @sql + N'    SET NOCOUNT ON;'+@CRLF
SET @sql = @sql + N'    UPDATE  Audit.dbo.ObjectUpdates'+@CRLF
SET @sql = @sql + N'    SET RequiresUpdate = 1'+@CRLF
SET @sql = @sql + N'    WHERE   DatabaseName = '''+@dbname+''' '+@CRLF
SET @sql = @sql + N'        AND ObjectName = '''+@objname+''' '+@CRLF
SET @sql = @sql + N'END' +@CRLF
SET @sql = @sql + N'ELSE' +@CRLF
SET @sql = @sql + N'BEGIN' +@CRLF
SET @sql = @sql + N'    SET NOCOUNT ON;' +@CRLF
SET @sql = @sql + @CRLF
SET @sql = @sql + N'    -- Update ''SourceLastUpdated'' date.'+@CRLF
SET @sql = @sql + N'    UPDATE  Audit.dbo.ObjectUpdates'+@CRLF
SET @sql = @sql + N'    SET SourceLastUpdated = GETDATE() '+@CRLF
SET @sql = @sql + N'    WHERE   DatabaseName = '''+@dbname+''' '+@CRLF
SET @sql = @sql + N'        AND ObjectName = '''+@objname+''' '+@CRLF
SET @sql = @sql + N'END; '+@CRLF
--PRINT(@sql);
EXEC sp_executesql @sql;
FETCH NEXT FROM ObjectCursor
INTO    @dbname,@schemaname,@objname;
END
CLOSE ObjectCursor ;
DEALLOCATE ObjectCursor ;
END

Si j'utilise PRINT et collez le code pour une nouvelle fenêtre de requête, le code s'exécute sans problème.

J'ai enlevé la GO états comme ce fut également donner des erreurs.

Ce qui me manque?
Pourquoi suis-je une erreur en utilisant les EXEC(@sql); ou même EXEC sp_executesql @sql;?
Est-ce quelque chose à voir avec le contexte à l'intérieur de EXEC()?
Merci beaucoup pour toute aide.

OriginalL'auteur MarkusBee | 2012-04-26