[笔记][MSSQL]执行多段指令时(2) - 发生错误后的除错方式

HI!以下是第一篇
[笔记][MSSQL]执行多段指令时(1) - 发生错误就停止执行

再来就是,因为我昨天汇入的时候在某一笔出错了,但是这种写法他只会显示更动了几笔,不会像一般错误会告诉你第几行错了,点两下错误讯息还可以把错的那一行给反白,而这种方式也有他的侦错方式,我们先试着将昨天的SQL多加段语法:

BEGIN TRYBEGIN TRANSACTION  INSERT INTO [Order Details] (OrderID,ProductID,UnitPrice,Quantity,Discount)  VALUES('11078','11','14.00','10','0')  INSERT INTO [Order Details] (OrderID,ProductID,UnitPrice,Quantity,Discount)  VALUES('11078','1111111111111111111111111111111111111','14.00','10','0')  INSERT INTO [Order Details] (OrderID,ProductID,UnitPrice,Quantity,Discount)  VALUES('11078','12','14.00','10','0')  COMMIT TRANSACTIONEND TRYBEGIN CATCHROLLBACK TRANSACTION--在执行完后去SELECT错误资讯SELECT          --SELECT错误代码        ERROR_NUMBER() AS ErrorNumber          --SELECT错误行数        ,ERROR_LINE() AS ErrorLine          --SELECT错误讯息        ,ERROR_MESSAGE() AS ErrorMessage;  END CATCH

执行结果如下,可以看到第几行、什么错误都一清二楚。
http://img2.58codes.com/2024/20106935XGUn70PzZ8.jpg

顺便附上如果把SELECT错误资讯移到TRY中,执行没有错误的结果,SQL如下:

BEGIN TRYBEGIN TRANSACTION  INSERT INTO [Order Details] (OrderID,ProductID,UnitPrice,Quantity,Discount)  VALUES('11078','11','14.00','10','0')  INSERT INTO [Order Details] (OrderID,ProductID,UnitPrice,Quantity,Discount)  VALUES('11078','12','14.00','10','0')  COMMIT TRANSACTION  SELECT          ERROR_NUMBER() AS ErrorNumber          ,ERROR_LINE() AS ErrorLine          ,ERROR_MESSAGE() AS ErrorMessage; END TRYBEGIN CATCHROLLBACK TRANSACTIONEND CATCH

执行结果如下,因为没有错误,所以SELECT出NULL。
http://img2.58codes.com/2024/201069357LzyqnmGnC.jpg

所以如果是使用这种方式,也可以利用SQL本身的ERROR_MESSAGE来获得错误资讯!

不过我那天多遇到了一个问题,就是我的SQL组好后有好几千行,而他的错误显示在第两千多行的地方,根本就无从找起...所以我顺便找一下打开行数显示的方法!

一般我们看到的SQL编辑区的左边侧栏会是空的:
http://img2.58codes.com/2024/20106935jYuL3aJdmA.jpg

从上方的工具列点选「工具」→「选项」开启以下视窗:
http://img2.58codes.com/2024/20106935UevlqE8GRS.jpg
照着红框依序点选「文字编辑器」→「所有语言」就到了上头的画面,勾选行号后,点选「确定」就大功告成!以下为设定完后的编辑视窗:
http://img2.58codes.com/2024/20106935sr3dVkCRtC.jpg

如此一来应该就能快速找到错误的行找原因了。

啊啊再顺便说一下(太啰嗦了XD),通常我们在VisualStudio侦错时,都会去从组好的SQL字串下手複製,再贴到MSSQL中执行看语法上出了什么错,可是我们这时候複製出来的整段SQL通常都不会断行,这样在面对大量SQL的时候总是很难去找出问题,要自己断行又觉得麻烦,所以我会用SQL Format来把他排列整齐,网址如下(关键字SQLFormat大家可以找自己喜欢的^^):
http://www.dpriver.com/pp/sqlformat.htm
只要在上方窗格贴上整段SQL,再点中间的FormatSQL就会在下方窗格出现排列好的语法了!
侦错时直接读整齐的语法也可以减少不必要的时间浪费XD

Function:
1.ERROR_NUMBER()
可以找出上一次执行的错误代码,如果没有错会回传NULL
2.ERROR_LINE()
可以找出上一次执行的错误行数,如果没有错会回传NULL
3.ERROR_MESSAGE()
可以找出上一次执行的错误讯息,如果没有错会回传NULL

参考文章:
1.https://msdn.microsoft.com/zh-tw/library/ms165340.aspx
2.https://technet.microsoft.com/zh-tw/library/ms179296(v=sql.105).aspx


关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章