SQL 2008 RAISERROR语法在SQL 2012/2014不兼容问题

简介: 原文 旧的RAISERROR语法在SQL 2012不兼容问题 raiserror 写法:  SQL 2008: raiserror 55030 'text error' SQL 2012: raiserror ('text error', 16, 1) --最近有一支Store Procedure,里面有使用RAISERROR。

原文 旧的RAISERROR语法在SQL 2012不兼容问题

raiserror 写法: 

SQL 2008: raiserror 55030 'text error'

SQL 2012: raiserror ('text error', 16, 1)

--最近有一支Store Procedure,里面有使用RAISERROR。而操作的方式是执行它后,并读取@@ERROR的值来判断有没有错误,如下,

 
CREATE PROC RaiseErrorTest
AS
    BEGIN
 
        RAISERROR 13001 'this is 13001 error';
 
    END
 
GO
 
 
 
DECLARE @errNum INT;
 
SET @errNum = 0;
 
 
 
EXEC RaiseErrorTest;
 
SET @errNum = @@ERROR;
 
--如果没有错误,就commit交易
 
IF @errNum = 0
    BEGIN
 
        PRINT '执行OK Commit'
 
    END
 
ELSE
    BEGIN
 
        PRINT '执行失败 Rollback'
 
    END

    GO
--执行结果会显示「执行失败 Rollback ,如下,

--Msg 13001, Level 16, State 1, Procedure RaiseErrorTest, Line 4
--this is 13001 error
--执行失败 Rollback

 

--但是在SQL 2012中一执行到该Store Procedure,就发生以下的错误,

--Msg 102, Level 15, State 1, Procedure RaiseErrorTest, Line 4
--接近 '13001' 之处的语法不正确。

 

--原因是因为我们使用了以下的RAISERROR语法过期了(从Sybase来的,可参考:raiserror)

--而在SQL 2008R2就说未来版本不Support以上的写法(SQL 2012还真的给我不Support)! 请参考:Deprecated Database Engine Features in SQL Server 2008 R2

--不过,那为何那支Store Procedure,可以被建立到SQL 2012的DB之中呢?

--因为那个DB是后SQL 2005备份好之后,再Restore到SQL 2012上,所以如果要重新将该Store Procedure执行到该DB的话,就会发生同样的问题。

--知道了问题所在就要加以调整它,如下,

 
 
CREATE PROC RaiseErrorTest2
AS
    BEGIN
 
        RAISERROR('this is 13001 error', 10, 1);
 
    END
 
GO
 
 
 
--再执行以下的SQL,
 
 
 
DECLARE @errNum INT;
 
SET @errNum = 0;
 
 
EXEC RaiseErrorTest2;
 
SET @errNum = @@ERROR;
 
IF @errNum = 0
    BEGIN
 
        PRINT '执行OK Commit'
 
    END
 
ELSE
    BEGIN
 
        PRINT '执行失败 Rollback'
 
    END

--但执行结果却显示「执行OK Commit」,天呀! 我的@@ERROR的值变成0了!如下,

--this is 13001 error
--执行OK Commit

 

--表示如果使用RAISERROR('this is 13001 error', 10, 1)的方式,@@ERROR的值却是0。

--于是想要用THROW,但这样呼叫的程序也要一并修改,就要调查程序中有多少使用到这种方式,然后加以调整,但是THROW又不能用在SQL 2012之前的版本。 

--

--于是笔者想到一个很瞎的作法,但却能暂时满足SQL 2005 ~ SQL 2012的这种透过 RAISERROR 来判断@@ERROR不为0的做法。

--就是使用RAISERROR(msg_id , 10, 1),因为使用msg_id的话,需要透过 sp_addmessage 将讯息加入SQL之中,如果没有的话,就会产生错误。

--所以利用这错误,@@ERROR就会变成不为0,呼叫的程序就可以判断了,如下,

 
CREATE PROC RaiseErrorTest3
AS
    BEGIN
 
        RAISERROR(50001, 10, 1);
 
    END
 
GO
 
 
--再執行以下的SQL,
 
 
DECLARE @errNum INT;
 
SET @errNum = 0;
 
EXEC RaiseErrorTest3;
 
SET @errNum = @@ERROR;
 
IF @errNum = 0
    BEGIN
 
        PRINT '執行OK Commit'
 
    END
 
ELSE
    BEGIN
 
        PRINT '執行失敗 Rollback'
 
    END

--执行结果会显示「执行失败 Rollback」(只是@@ERROR的值变成了18054,而不是我们要的50001,但针对我们旧有「只判断@@ERROR不为0」的做法算是可以兼容过去),如下,

--Msg 18054, Level 16, State 1, Procedure RaiseErrorTest3, Line 4
--Error 50001, severity 10, state 1 was raised, but no message with that error number was found in sys.messages. If error is larger than 50000, make sure the user-defined message is added using sp_addmessage.
--执行失败 Rollback

 

 

目录
相关文章
|
5月前
|
SQL 关系型数据库 MySQL
MySQL数据库基础第一篇(SQL通用语法与分类)
MySQL数据库基础第一篇(SQL通用语法与分类)
|
5月前
|
SQL PHP
thinkphp之进阶sql语法,持续更新
thinkphp之进阶sql语法,持续更新
29 0
|
8天前
|
SQL 数据库
SQL数据库基础语法入门
[link](http://www.vvo.net.cn/post/082935.html)
|
15天前
|
SQL 存储 关系型数据库
mysql SQL必知语法
本文详细介绍了MySQLSQL的基本语法,包括SELECT、FROM、WHERE、GROUPBY、HAVING、ORDERBY等关键字的使用,以及数据库操作如创建、删除表,数据类型,插入、查询、过滤、排序、连接和汇总数据的方法。通过学习这些内容,读者将能更好地管理和操
9 0
|
23天前
|
SQL 关系型数据库 MySQL
Mysql(2)—SQL语法详解
SQL(Structured Query Language,结构化查询语言)是一种用于管理关系型数据库的标准编程语言。它主要用于数据的查询、插入、更新和删除等操作。SQL最初在1970年代由IBM的研究人员开发,旨在处理关系数据模型。
22 0
|
3月前
|
SQL 关系型数据库 MySQL
INSERT INTO t_a.tableName SELECT * FROM t_b.tableName 如何通过定义一个list对象,包含多个tableName,循环执行前面的sql,用MySQL的语法写
【8月更文挑战第7天】INSERT INTO t_a.tableName SELECT * FROM t_b.tableName 如何通过定义一个list对象,包含多个tableName,循环执行前面的sql,用MySQL的语法写
38 5
|
4月前
|
SQL 关系型数据库 数据库
sql语法
【7月更文挑战第30天】sql语法
44 12
|
3月前
|
SQL 关系型数据库 MySQL
SQL Server、MySQL、PostgreSQL:主流数据库SQL语法异同比较——深入探讨数据类型、分页查询、表创建与数据插入、函数和索引等关键语法差异,为跨数据库开发提供实用指导
【8月更文挑战第31天】SQL Server、MySQL和PostgreSQL是当今最流行的关系型数据库管理系统,均使用SQL作为查询语言,但在语法和功能实现上存在差异。本文将比较它们在数据类型、分页查询、创建和插入数据以及函数和索引等方面的异同,帮助开发者更好地理解和使用这些数据库。尽管它们共用SQL语言,但每个系统都有独特的语法规则,了解这些差异有助于提升开发效率和项目成功率。
274 0
|
4月前
|
SQL Java 数据库连接
mybatis动态SQL常用语法总结
MyBatis 使用 OGNL 表达式语言处理动态SQL,如 `if` 标签进行条件判断,`choose`、`when`、`otherwise` 实现多条件选择,`where`、`set` 管理SQL关键字,`trim` 提供通用修剪功能,`foreach` 遍历集合数据。`sql` 和 `include` 用于代码重用,`selectKey` 处理插入后的返回值。参数传递支持匿名、具名、列表、Map、Java Bean和JSON方式。注意SQL转义及使用合适的jdbcType映射Java类型。
86 7
|
4月前
|
SQL 数据库 索引
SQL SELECT语句的语法与查询优化技巧
SQL SELECT语句的语法与查询优化技巧