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

 

 

时间: 2024-12-11 08:36:07

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

SQL SELECT DISTINCT 语法与使用教程

SQL SELECT DISTINCT 语法与使用教程 本章将解释选择离散发言. 在SQL选择不同的声明 在一个表中,一些列可能包含重复的值.这不是一个问题,然而,有时你会希望只列出不同(不同的)值在桌子上. 的独特的关键字可以用来只返回独特的(不同)的价值. 选择不同的SQL语法 SELECT DISTINCT column_name(s) FROM table_name   选择不同的榜样 在"person"表: P_Id LastName FirstName Address Ci

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

原文 http://www.cnblogs.com/wghao/archive/2012/12/30/2837642.html 开始:  在网络上,看到有SQL Server 2000和SQL Server 2005 的存储过程加密和解密的方法,后来分析了其中的代码,发现它们的原理都是一样的.后来自己根据实际的应用环境,编写了两个存储过程,一个加密存储过程 (sp_EncryptObject),和一个解密存储过程(sp_EncryptObject),它们可以应用于SQL Server中的储过程,

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

    本文总结一下SQL SERVER 2012/2014链接到SQL SERVER 2000的各种坑,都是在实际应用中遇到的疑难杂症.可能会有人说怎么还在用SQL SERVER 2000,为什么不升级呢? 每个公司都会有一两个几乎快被人遗忘的系统,接手维护这些系统的人可能都不知换了多少批了.它们的命运注定慢慢消亡.然而偏偏却又生命力顽强,总还有一些 人在使用着这些系统.所以就处在一种尴尬的境地: 升级吧,价值不大,可能再过一两年,这系统就要被其它系统替代了.而且项目经理也没有精力.人手耗费在

SQL SERVER存储过程语法详解

SQL SERVER存储过程语法: Create PROC [ EDURE ] procedure_name [ ; number ] [ { @parameter data_type } [ VARYING ] [ = default ] [ OUTPUT ] ] [ ,...n ] [ WITH { RECOMPILE | ENCRYPTION | RECOMPILE , ENCRYPTION } ] [ FOR REPLICATION ] AS sql_statement [ ...n ]

通过SQL 2008实现可预测的分析

SQL Server 技术文档 作者:Graeme Malcolm (实习生) 技术审核员:Roni Karassik and Donald Farmer 项目编辑:Joanne Hodgins 发布日期:2007年11月 适用产品:SQL Server 2008 概述:Microsoft SQL Server 2008通过一系列完整且直觉化的数据挖掘工具来提供可预测的分析.通过和微软商业智能平台的无缝集成,可以在数据生命周期的每一个步骤中提供丰富的洞察力.此外,灵活的平台可以让你将这种预测性扩

SQL Server 2008远程链接时SQL数据库不成功怎么办

  远程连接SQL Server 2008,服务器端和客户端配置 关键设置: 第一步(SQL2005.SQL2008): 开始-->程序-->Microsoft SQL Server 2008(或2005)-->配置工具-->SQL Server 配置管理器-->SQL Server网络配置-->MSSQLSERVER(这个名称以具体实例名为准) 的协议-->TCP/IP-->右键-->启用 第二步: SQL2005: 开始-->程序-->

sql group by语法与实例

  sql group by语法与实例 group by 语句 group by 语句用于结合合计函数,根据一个或多个列对结果集进行分组. sql group by 语法 select column_name, aggregate_function(column_name) from table_name where column_name operator value group by column_name 来看一个group by实例 比如表里内容是这样 gameid best top s

sql 2008中,为什么第一次录入的信息下一次再打开时就没有了?

问题描述 sql 2008中,为什么第一次录入的信息下一次再打开时就没有了? sql 2008中,为什么第一次录入的信息下一次再打开时就没有了?为什么,怎么改呢?求大神指点 解决方案 你用语句插得还是直接在表里面插得,SQL里面插入是 insert 成功后会返回受影响行数,如果在表里面插得话,有时候会出现点问题,如约束. 这种情况 我也遇到过,插入数据了,可是数据库不显示,但是后来我又重启了一下电脑,重新打开了一下数据库,发现又有了,具体原因不知 解决方案二: 数据库数据是否提交成功.怎么保存的

visual studio 2010-我的电脑安装了VS2010 现在要安装 SQL 2008 出问题了

问题描述 我的电脑安装了VS2010 现在要安装 SQL 2008 出问题了 下载了一个 SQLManagementStudio_x64_CHS, 安装的时候出现了这个问题,如下图,怎么办? 解决方案 安装sql2008和vs2010 解决方案二: 换一个安装包呢,这个主要跟你系统环境相关. 解决方案三: 建议先装SQLserver,再装vs2010,我以前也遇到过,按我这顺序应该能解决. 解决方案四: 先装SQLserver再装vs2010.或者下一个虚拟光驱在安装. 解决方案五: 先装SQL