SQL中存储过程中使用事务,并且加入异常处理机制.

--存储过程中使用事务,并且加入异常处理机制.
-- =============================================
CREATE PROCEDURE [dbo].[UP_Orders_Import]
AS
BEGIN
	BEGIN TRAN  --开启事务
		BEGIN TRY  

			SELECT 1/0

			COMMIT TRAN  --提交事务
		END TRY
    BEGIN CATCH
        DECLARE
            @ErrorMessage NVARCHAR(4000) ,
            @ErrorNumber INT ,
            @ErrorSeverity INT ,
            @ErrorState INT ,
            @ErrorLine INT ,
            @ErrorProcedure NVARCHAR(200) ;  

        SELECT
                @ErrorNumber=ERROR_NUMBER(),@ErrorSeverity=ERROR_SEVERITY(),
                @ErrorState=ERROR_STATE(),@ErrorLine=ERROR_LINE(),
                @ErrorProcedure=ISNULL(ERROR_PROCEDURE(),'-') ;
        SELECT
                @ErrorMessage=N'Error %d, Level %d, State %d, Procedure %s, Line %d, '
                +'Message: '+ERROR_MESSAGE() ;
        RAISERROR
        (
		   @ErrorMessage,
		   @ErrorSeverity,
		   1,
		   @ErrorNumber,    -- parameter: original error number.
		   @ErrorSeverity,  -- parameter: original error severity.
		   @ErrorState,  -- parameter: original error state.
		   @ErrorProcedure, -- parameter: original error procedure name.
		   @ErrorLine       -- parameter: original error line number.
		) ;
        ROLLBACK TRAN  --回滚事务
    END CATCH
END

  sql事务注意点:

        DECLARE @Referenznummer NVARCHAR(MAX)
        SET @Referenznummer = '934590-AE1023-1'

        BEGIN TRAN
        BEGIN TRY	

          DECLARE @returnValue INT
          SET @returnValue = 11110

             --(1)、变量在事务中是不会进行回滚的;默认值虽然是11110
            SET @returnValue = 1  

            IF (
                NOT EXISTS ( SELECT 1
                             FROM   tbOrder
                             WHERE  Referenznummer = @Referenznummer )
               )
                BEGIN  

				    --(2)、出现异常后,直接终止下面的代码,跳转到CATCH代码块中.
                    SELECT  10 / 0
				    --begin
                    SELECT  @@ERROR
                    SELECT  100
                    IF (@@error <> 0)   --此语句在try catch中是捕获不到的。
                        BEGIN
                            SET @returnValue = 0
                        END
					--end
                END
            ELSE
                BEGIN
                    SET @returnValue = 3
                END
            COMMIT TRAN
        END TRY
        BEGIN CATCH
            PRINT 'error'
            --SET @returnValue = 0
            ROLLBACK TRAN
        END CATCH

        SELECT  @returnValue
        --RETURN @returnValue  

  

时间: 2024-10-04 12:45:14

SQL中存储过程中使用事务,并且加入异常处理机制.的相关文章

Sql server存储过程中常见游标循环用法

原文:Sql server存储过程中常见游标循环用法 用游标,和WHILE可以遍历您的查询中的每一条记录并将要求的字段传给变量进行相应的处理 DECLARE @A1 VARCHAR(10), @A2 VARCHAR(10), @A3 INT DECLARE YOUCURNAME CURSOR FOR SELECT A1,A2,A3 FROM YOUTABLENAME OPEN YOUCURNAME fetch next from youcurname into @a1,@a2,@a3 while

SQL Server存储过程中编写事务处理的方法小结_MsSql

本文实例讲述了SQL Server存储过程中编写事务处理的方法.分享给大家供大家参考,具体如下: SQL Server中数据库事务处理是相当有用的,鉴于很多SQL初学者编写的事务处理代码存往往存在漏洞,本文我们介绍了三种不同的方法,举例说明了如何在存储过程事务处理中编写正确的代码.希望能够对您有所帮助. 在编写SQL Server 事务相关的存储过程代码时,经常看到下面这样的写法: begin tran update statement 1 ... update statement 2 ...

SQL Server存储过程中编写事务处理的方法小结

本文实例讲述了SQL Server存储过程中编写事务处理的方法.分享给大家供大家参考,具体如下: SQL Server中数据库事务处理是相当有用的,鉴于很多SQL初学者编写的事务处理代码存往往存在漏洞,本文我们介绍了三种不同的方法,举例说明了如何在存储过程事务处理中编写正确的代码.希望能够对您有所帮助. 在编写SQL Server 事务相关的存储过程代码时,经常看到下面这样的写法: begin tran update statement 1 ... update statement 2 ...

net framework-请问如何在SQL的存储过程中使用UDT?

问题描述 请问如何在SQL的存储过程中使用UDT? 我自己写了一个类Vector3,并且编译成类库文件,将程序集添加到了一个本地数据库中.在建表的时候已经可以使用这个UDT.但如何在存储过程中使用它呢?查阅MSDN,上面说 : Transact-SQL 没有为在对用户定义类型 (UDT) 列中的数据进行修改时所使用的 INSERT.UPDATE 或 DELETE 语句提供专用语法. Transact-SQL CAST 或 CONVERT 函数用于将本机数据类型转换为 UDT 类型. 但是我在使用

sql 2005 存储过程中给变量赋值出错

问题描述 sql 2005 存储过程中给变量赋值出错 -- ============================================= ALTER PROCEDURE [dbo].procselect, @index int,---当前页码 @size int,---每页记录数 @n INT OUTPUT, @pages int output---总页数,输出参数 ) AS BEGIN SET NOCOUNT ON; declare @strc varchar(50); decl

Sql Server 存储过程中查询数据无法使用 Union(All)

原文:Sql Server 存储过程中查询数据无法使用 Union(All) 微软Sql Server数据库中,书写存储过程时,关于查询数据,无法使用Union(All)关联多个查询.     1.先看一段正常的SQL语句,使用了Union(All)查询:      SELECT ci.CustId --客户编号 , ci.CustNam --客户名称 , ci.ContactBy --联系人 , ci.Conacts --联系电话 , ci.Addr -- 联系地址 , ci.Notes --

关于C#取SQL Server存储过程中的结果集和输出参数的问题

问题描述 今天在写一个例子,用C#取存储过程中的结果集和输出参数的值的问题,问题描述如下:1,用SqlCommand.ExecuteReader(),在返回的SqlDataReader中,能取到结果集,但是取不到存储过程中的输出参数.2,用SqlCommand.ExecuteNonQuery()方法执行,可以取存储过程中的返回值,但是结果集从哪里来?先上代码如下:sqlcreateproc[GetAll(@SelectIdint,@AllCountintoutput--输入输出参数)asbeng

SQL Server存储过程中使用表值作为输入参数示例_MsSql

在2008之前如果我们想要将表作为输入参数传递给SQL Server存储过程使比较困难的,可能需要很多的逻辑处理将这些表数据作为字符串或者XML传入. 在2008中提供了表值参数.使用表值参数,可以不必创建临时表或许多参数,即可向 Transact-SQL 语句或例程(如存储过程或函数)发送多行数据,这样可以省去很多自定义的代码.这样的操作对于存储过程内基于表函数的操作变得非常容易操作. 表值参数是使用用户定义的表类型来声明的.所以使用之前要先定义表类型. /* 创建表类型.*/ CREATE

sql server存储过程中SELECT 与 SET 对变量赋值的区别

SQL Server 中对已经定义的变量赋值的方式用两种,分别是 SET 和 SELECT. 对于这两种方式的区别,SQL Server 联机丛书中已经有详细的说明,但很多时候我们 并没有注意,其实这两种方式还是有很多差别的. SQL Server推荐使用 SET 而不是 SELECT 对变量进行赋值. 当表达式返回一个值并对一个变量进行赋值时,推荐使用 SET 方法. 下表列出 SET 与 SELECT 的区别.请特别注意红色部分. set select 同时对多个变量同时赋值 不支持 支持