Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在SQL Server事务中创建过程_Sql_Sql Server_Sql Server 2008_Tsql - Fatal编程技术网

在SQL Server事务中创建过程

在SQL Server事务中创建过程,sql,sql-server,sql-server-2008,tsql,Sql,Sql Server,Sql Server 2008,Tsql,我是SQL Server新手,我正在尝试在事务中创建一个过程,如下所示: BEGIN TRY SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; BEGIN TRANSACTION MyTran --*****************************************************************************

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

        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行
关键字“过程”附近的语法不正确

味精102,第15级,状态1,第5行
“BEGIN”附近的语法不正确

味精102,第15级,状态1,第14行
靠近“END”的语法不正确


如果无法在SQL Server中执行此操作,那么解决方法是什么?

您的语法错误

    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

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

中有一个很好的答案

用户表示: 请尝试在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

旁注:存储过程不应使用
sp
前缀。微软已经这样做了,而且你确实有可能在将来的某个时候发生名称冲突。最好只是简单地避免使用
sp.
并使用其他东西作为前缀,或者根本不使用前缀!如何创建程序??这是你的问题吗??选中此链接您无法在事务中创建过程-这根本没有意义-您想完成什么?@ninesided我有多个存储过程要创建。我希望它们都在一个事务中创建。谷歌如何创建sql server存储过程。不能那样用。在发布愚蠢的问题之前,您应该先阅读文档。请记住,我的答案实际上是针对OP打算在事务中创建存储过程的时间(正如他所声称的,他可能没有正确编写它)。如果OP打算在SP中使用事务,则不适用。如果后者为真,请参阅本页上的其他答案。感谢您的回答。我承认解决方案,但我现在面临另一个问题。我有多个过程要创建,我需要在一个事务中创建它们。除了将它们放入varchar之外,还有其他解决方案吗?因为sp正文很长,并且有很多单引号。没有。TT的解决方案是正确的,并且是一些工具在事务中编写大型部署脚本的方式。@user1912404除了将它们放在VARCHAR中并使用我概述的方法之外,没有其他方法可以做到这一点。是的,转义单引号是一个拖拽。。。
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