在 SQL Server 事务中创建过程

Posted

技术标签:

【中文标题】在 SQL Server 事务中创建过程【英文标题】:Create a procedure in a SQL Server transaction 【发布时间】: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 中完成,有什么解决方法?

【问题讨论】:

旁注:您应该为您的存储过程使用sp_ 前缀。微软有reserved that prefix for its own use (see Naming Stored Procedures),你确实会在未来某个时候冒着名称冲突的风险。 It's also bad for your stored procedure performance。最好只是简单地避免 sp_ 并使用其他东西作为前缀 - 或者根本不使用前缀! 如何创建程序??这是你的问题吗??检查此链接msdn.microsoft.com/en-us/library/ms187926.aspx 你不能在inside事务中创建一个过程——这甚至没有意义——你想完成什么? @nineside 我有多个存储过程要创建。我希望它们都在一个事务中创建。 谷歌如何创建sql server存储过程。不能这样用。在发布愚蠢的问题之前,您应该先阅读文档。 【参考方案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

【讨论】:

以上是关于在 SQL Server 事务中创建过程的主要内容,如果未能解决你的问题,请参考以下文章

如何收缩 SQL Server 中的 Tempdb 数据库

sql server 和 mysql 之间的链接服务器上的分布式事务

在一个事务中调用多个 SQL Server 存储过程

SQL Server 复制:事务发布(读写分离)

SQL SERVER存储过程中使用事务

SQL Server 临时对象缓存