在SQL Server事务中创建过程
我是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 --*****************************************************************************
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