GO causes error when used in EXEC: “Incorrect syntax near 'GO'.”

前端 未结 4 1484
被撕碎了的回忆
被撕碎了的回忆 2021-01-21 18:24

I\'ve created this stored procedure which dynamically creates the same trigger for all my tables:

USE [MyDatabase]
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIE         


        
4条回答
  •  野的像风
    2021-01-21 18:33

    You must execute each part of command in single exec() command.

    Try this:

    CREATE PROCEDURE sp_CreateDataChangedTrigger
        -- Add the parameters for the stored procedure here
        @TableName varchar(255), 
        @TableKey  varchar(255),
        @Debug     bit=1
    AS
    BEGIN
        -- SET NOCOUNT ON added to prevent extra result sets from
        -- interfering with SELECT statements.
        SET NOCOUNT ON;
    
         DECLARE @SQLPart1 varchar(max);
         DECLARE @SQLPart2 varchar(max);
    
         SET @SQLPart1 = '
    --Drop Trigger
    BEGIN TRY
         DROP TRIGGER [dbo].[TR_' + @TableName + '_Audit]
    END TRY
    BEGIN CATCH
    END CATCH
    '
    
    SET @SQLPart2 = '
    --Create Trigger
    CREATE TRIGGER [dbo].[TR_' + @TableName + '_Audit]
         ON [dbo].[' + @TableName + ']
         AFTER INSERT, UPDATE, DELETE
    AS
    BEGIN
         SET NOCOUNT ON
         DECLARE @event_type [char]
    
         --Get Event Type
         IF EXISTS(SELECT * FROM INSERTED)
         IF EXISTS(SELECT * FROM DELETED)
              SELECT @event_type = ''U''
         ELSE
              SELECT @event_type = ''I''
         ELSE
         IF EXISTS(SELECT * FROM deleted)
              SELECT @event_type = ''D''
         ELSE
         --no rows affected - cannot determine event
              SELECT @event_type = ''K''
    
         IF @event_type IN (''I'',''U'') BEGIN
              DECLARE @CurrentUserID INT;
              SELECT  @CurrentUserID = u.UserID
              FROM    [dbo].[dim_Users] u
              WHERE   u.[Username] = dbo.udfUserName()
    
              UPDATE  t
              SET     DateModified = GETDATE(),
                      WhoModifiedID = @CurrentUserID
              FROM    INSERTED e
              JOIN    [dbo].[' + @TableName + '] t ON e.[' + @TableKey + '] = t.[' + @TableKey + ']
         END
    
         IF @event_type = ''D'' BEGIN
              no_op:  --Nothing for now
         END
    END
    ';
    
         IF @Debug=1 BEGIN
              set nocount on;
              print @SQLPart1;
              print @SQLPart2;
         END
         ELSE BEGIN
              exec(@SQLPart1);
              exec(@SQLPart2);
         END    
    END
    GO
    

提交回复
热议问题