在 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 事务中创建过程的主要内容,如果未能解决你的问题,请参考以下文章