原文 旧的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

SQL 2008 RAISERROR语法在SQL 2012/2014不兼容问题的更多相关文章

  1. sql 2008常用语法语句收集

    EXEC sp_dropuser 'test' : 从当前数据库删除用户 test EXEC sp_droplogin 'test' : 从 SQL Server 中删除登录 test select ...

  2. [SQL]动态sql语句基本语法

    动态sql语句基本语法 :普通SQL语句可以用Exec执行 eg: Select * from tableName Exec('select * from tableName') Exec sp_ex ...

  3. SQL SERVER 2012/2014 链接到 SQL SERVER 2000的各种坑

    本文总结一下SQL SERVER 2012/2014链接到SQL SERVER 2000的各种坑,都是在实际应用中遇到的疑难杂症.可能会有人说怎么还在用SQL SERVER 2000,为什么不升级呢? ...

  4. 升级到SQL Server 2012/2014时一些需要考虑的事项

    1. 使用Upgrade Adviser评估升级前需要解决的事情. https://msdn.microsoft.com/zh-cn/library/ms144256(v=sql.110).aspx ...

  5. (转)对存储过程进行加密和解密(SQL 2008/SQL 2012)

    原文地址:http://www.cnblogs.com/wghao/archive/2012/12/30/2837642.html 开始: 在网络上,看到有SQL Server 2000和SQL Se ...

  6. SQLPrompt 6.3.0.354 完美破解 安装于 SQL Server 2012/2014

    SQL SERVER 2012格式化 SQL SERVER 2014格式化 SQLPrompt_6.4.0.641 破解版 百度云下载 迅雷下载 百度网盘下载 SQL Prompt 是一款拥有SQL智 ...

  7. 分享SQL Server 2012/2014内存数据库,AlwaysOn,参考教材与网上总结

    Sql Server 2012 高可用性的几种方案的比较,AlwaysOn优势何在 对Sql Server 2012 高可用性与灾难恢复的几种方案的比较,复制,集群,镜像优劣何在,新生技术Always ...

  8. SQL Server 2008 R2升级到SQL Server 2012 SP1

    1.建议对生产环境对的数据库升级之前做好备份,以防不测. 2.从SQL Server 2008 R2 升级到SQL Server 2012 SP1,需要先安装SQL Server 2008 R2 的S ...

  9. Windows Server 2008 R2 SP1安装SQL 2012安装报错之0x858C001B

    使用Windows Server 2008 R2 SP1安装SQL 2012的时候总是报这样一个错: SQL Server Setup has encountered the following er ...

随机推荐

  1. reqSUB错误

    ---- ERROR ----    Error in dispatcher subroutine reqSUB: Invalid PAR(1): 0502 上面是用adams/ca加载一个汽车模型时 ...

  2. BZOJ4320 : ShangHai2006 Homework

    取$M=\sqrt{300000}$. 设$g[i]$表示程序员的$\bmod i$最小的值. 若$Y<M$,那么可以在$O(M)$时间内完成对所有$g[i]$的修改,$O(1)$时间内完成查询 ...

  3. android 屏幕截取,pull到pc端

    1.当需要截取手机屏幕时,进行批命令点击,截取adb pull到电脑端,或者进行接口上传到服务器. GetScreen.bat @ECHO OFF :: read config.cfg SETLOCA ...

  4. 【BZOJ】3669: [Noi2014]魔法森林(lct+特殊的技巧)

    http://www.lydsy.com/JudgeOnline/problem.php?id=3669 首先看到题目应该可以得到我们要最小化 min{ max{a(u, v)} + max{b(u, ...

  5. FileStorage Read String Start With Number Need Quotation Mark 读取数字开头的字符串需要加引号

    // Write data FileStorage fs("test.yml", FileStorage::WRITE); fs << "MyString&q ...

  6. state配置语言实战

    修改配置文件:(base用来放初始化环境.prod用来放生产配置环境) [root@super65 ~]# vim /etc/salt/master [root@super65 ~]# mkdir - ...

  7. CUTE FTP 控制连接已关闭

    使用Cute FTP连接FTP站点时,出现上述错误,在另外一台电脑上却可以正常连接. 原因:FTP服务器IP访问规则的限制 解决方法:在ServerU 服务器中进入服务器详细信息配置界面,在IP访问规 ...

  8. Eclipse代码提示功能是不是利用反射

    希望看到这个空文章的你能够说说你的意见………………

  9. Redis在windows环境下的部署

    一.下载 官网地址:http://redis.io/download Git地址:https://github.com/MSOpenTech/redis 注:官方无windows版本,需要window ...

  10. poj 2186 tarjan求强连通分量

    蕾姐讲过的例题..玩了两天后才想起来做 貌似省赛之后确实变得好懒了...再努力两天就可以去北京玩了! 顺便借这个题记录一下求强连通分量的算法 1 只需要一次dfs 依靠stack来实现的tarjan算 ...