【问题标题】:Create a procedure in a SQL Server transaction在 SQL Server 事务中创建过程
【发布时间】:2014-11-14 10:05:15
【问题描述】:

我是 SQL Sever 的新手,我正在尝试在事务中创建一个过程,如下所示:

        BEGIN TRY
        SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
        BEGIN TRANSACTION MyTran

        --*****************************************************************************         
        USE [Database]
        Create PROCEDURE [dbo].[SP_StoreProcedure] AS

        --Some SQL Queries here
        Go

        Commit TRANSACTION MyTran
        END TRY

        BEGIN CATCH
            ROLLBACK TRANSACTION ;
        END CATCH;
        SET TRANSACTION ISOLATION LEVEL READ COMMITTED

但是我得到了这些错误:

消息 156,第 15 级,状态 1,第 9 行
关键字“PROCEDURE”附近的语法不正确。

消息 102,第 15 级,状态 1,第 5 行
'BEGIN' 附近的语法不正确。

消息 102,第 15 级,状态 1,第 14 行
'END' 附近的语法不正确。

如果这不能在 SQL Server 中完成,有什么解决方法?

【问题讨论】:

标签: sql sql-server sql-server-2008 tsql


【解决方案1】:

存储过程的创建应该是脚本中的第一条语句。将您的存储过程创建放在VARCHAR(MAX)(即作为字符串)中,并使用EXEC sp_executesql <your_sp_creation_varchar>

【讨论】:

  • 请注意,我的回答实际上是针对 OP 打算在事务中创建存储过程的情况(正如他声称的那样,他可能没有正确编写它)。如果 OP 打算在 SP 中使用事务,则不会。如果后者为真,请参考本页其他答案。
  • 感谢您的回答。我承认了解决方案,但是我现在面临另一个问题。我有多个要创建的过程,我需要在一个事务中创建它们。由于 sp 主体很长并且有很多单引号,因此除了将它们放在 varchar 中之外还有其他解决方案。
  • 没有。 TT 的解决方案是正确的,并且是一些工具在事务中编写大型部署脚本的方式。
  • @user1912404 除了将它们放在 VARCHAR 中并使用我概述的方法之外,没有其他方法可以做到这一点。是的,转义单引号是一个拖累......
【解决方案2】:

您的语法错误

    Create PROCEDURE [dbo].[SP_StoreProcedure] AS
     SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
     BEGIN
       BEGIN TRY
       BEGIN TRANSACTION MyTran

    --Some SQL Queries here


       Commit TRANSACTION MyTran
       END TRY

       BEGIN CATCH
        ROLLBACK TRANSACTION ;
        PRINT ERROR_MESSAGE();   -- For Debugging
      END CATCH;
      SET TRANSACTION ISOLATION LEVEL READ COMMITTED
    END

【讨论】:

    【解决方案3】:
        USE [Database]
        Create PROCEDURE [dbo].[SP_StoreProcedure] AS
        SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
        BEGIN TRANSACTION MyTran
        BEGIN TRY
    
        Commit TRANSACTION MyTran
        END TRY
    
        BEGIN CATCH
            ROLLBACK TRANSACTION MyTran;
        END CATCH;
    

    【讨论】:

      【解决方案4】:

      TSQL - create a stored proc inside a transaction statement有一个很好的答案。

      用户KM 说: 尝试在 EXEC('...') 中执行创建过程,如下所示:

      Begin Try
      Begin Transaction 
          -- do a bunch of add/alter tables here
          -- do a bunch of data manipulation/population here
      
          -- create a stored proc
        EXEC ('create procedure dbo.test
        as
        begin
          select * from some_table
        end')
      Commit  
      End Try
      Begin Catch
          Rollback  
          Declare @Msg nvarchar(max)
          Select @Msg=Error_Message();
          RaisError('Error Occured: %s', 20, 101,@Msg) With Log;
      End Catch
      
      GO
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多