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
执行结果如下,可以看到第几行、什么错误都一清二楚。
顺便附上如果把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。
所以如果是使用这种方式,也可以利用SQL本身的ERROR_MESSAGE来获得错误资讯!
不过我那天多遇到了一个问题,就是我的SQL组好后有好几千行,而他的错误显示在第两千多行的地方,根本就无从找起...所以我顺便找一下打开行数显示的方法!
一般我们看到的SQL编辑区的左边侧栏会是空的:
从上方的工具列点选「工具」→「选项」开启以下视窗:
照着红框依序点选「文字编辑器」→「所有语言」就到了上头的画面,勾选行号后,点选「确定」就大功告成!以下为设定完后的编辑视窗:
如此一来应该就能快速找到错误的行找原因了。
啊啊再顺便说一下(太啰嗦了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