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。而操作的方式是执行它后,并读取@@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不兼容问题的更多相关文章
- sql 2008常用语法语句收集
EXEC sp_dropuser 'test' : 从当前数据库删除用户 test EXEC sp_droplogin 'test' : 从 SQL Server 中删除登录 test select ...
- [SQL]动态sql语句基本语法
动态sql语句基本语法 :普通SQL语句可以用Exec执行 eg: Select * from tableName Exec('select * from tableName') Exec sp_ex ...
- SQL SERVER 2012/2014 链接到 SQL SERVER 2000的各种坑
本文总结一下SQL SERVER 2012/2014链接到SQL SERVER 2000的各种坑,都是在实际应用中遇到的疑难杂症.可能会有人说怎么还在用SQL SERVER 2000,为什么不升级呢? ...
- 升级到SQL Server 2012/2014时一些需要考虑的事项
1. 使用Upgrade Adviser评估升级前需要解决的事情. https://msdn.microsoft.com/zh-cn/library/ms144256(v=sql.110).aspx ...
- (转)对存储过程进行加密和解密(SQL 2008/SQL 2012)
原文地址:http://www.cnblogs.com/wghao/archive/2012/12/30/2837642.html 开始: 在网络上,看到有SQL Server 2000和SQL Se ...
- SQLPrompt 6.3.0.354 完美破解 安装于 SQL Server 2012/2014
SQL SERVER 2012格式化 SQL SERVER 2014格式化 SQLPrompt_6.4.0.641 破解版 百度云下载 迅雷下载 百度网盘下载 SQL Prompt 是一款拥有SQL智 ...
- 分享SQL Server 2012/2014内存数据库,AlwaysOn,参考教材与网上总结
Sql Server 2012 高可用性的几种方案的比较,AlwaysOn优势何在 对Sql Server 2012 高可用性与灾难恢复的几种方案的比较,复制,集群,镜像优劣何在,新生技术Always ...
- SQL Server 2008 R2升级到SQL Server 2012 SP1
1.建议对生产环境对的数据库升级之前做好备份,以防不测. 2.从SQL Server 2008 R2 升级到SQL Server 2012 SP1,需要先安装SQL Server 2008 R2 的S ...
- Windows Server 2008 R2 SP1安装SQL 2012安装报错之0x858C001B
使用Windows Server 2008 R2 SP1安装SQL 2012的时候总是报这样一个错: SQL Server Setup has encountered the following er ...
随机推荐
- LightOJ1122 Digit Count(DP)
dp[i][j]表示长度i末尾为S[j]的方案数 dp[1][0...m-1]=1 dp[i][j]=∑dp[i-1][k] (|S[k]-S[j]|<=2) #include<cstdi ...
- 【wikioi】1018 单词接龙
题目链接 算法:DFS+考你阅题 题目描述: 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中 ...
- TJOI2016 && HEOI2016 解题报告
好吧我来写一波题解骗访问量QAQ 题目可以在cogs提交 bzoj4551~4456 D1T1 tree 树剖可做,然而有更简单的做法,10min搞定 维护一个并查集,时光倒流,如果当前点没有标记就把 ...
- [GE]导入图片至Word,然后按规则命名(2/2)
#将所有docx文件改成可读 Set-ItemProperty -Path "e:\screenshot\*.docx" -Name IsReadOnly -Value $fals ...
- Codeforces Round #375 (Div. 2)——D. Lakes in Berland(DFS连通块)
D. Lakes in Berland time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- li标签行内元素高度及居中
<head> <title><title> <style type="text/css"> * { padding: 0px; ma ...
- 2016.07.08,英语,《Vocabulary Builder》Unit 24
mand/mend comes from mandare, Latin for 'entrust' or 'order'. command and commandment: [kə'mændmənt] ...
- 简单实现Redis缓存中的排序功能
1.在实现缓存排序功能之前,必须先明白这一功能的合理性.不妨思考一下,既然可以在数据库中排序,为什么还要把排序功能放在缓存中实现呢?这里简单总结了两个原因:首先,排序会增加数据库的负载,难以支撑高并发 ...
- WITCH CHAPTER 0 [cry] 绝密开发中的史克威尔艾尼克斯的DX12技术演示全貌
西川善司的[WITCH CHAPTER 0 cry]讲座 ~绝密开发中的史克威尔艾尼克斯的DX12技术演示全貌 注:日文原文地址: http://pc.watch.impress.co.jp/d ...
- 用 BigDump 工具导入超大 MySQL 数据库备份文件
用 BigDump 工具导入超大 MySQL 数据库备份文件 创建于 2010-07-01, 周四 00:00 作者 白建鹏 在<Joomla! 1.5 网站防黑9条戒律>这篇文章中, ...