iT邦幫忙

1

[筆記][MSSQL]執行多段指令時(2) - 發生錯誤後的除錯方式

HI!以下是第一篇
[筆記][MSSQL]執行多段指令時(1) - 發生錯誤就停止執行

再來就是,因為我昨天匯入的時候在某一筆出錯了,但是這種寫法他只會顯示更動了幾筆,不會像一般錯誤會告訴你第幾行錯了,點兩下錯誤訊息還可以把錯的那一行給反白,而這種方式也有他的偵錯方式,我們先試著將昨天的SQL多加段語法:

BEGIN TRY

BEGIN 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 TRANSACTION

END TRY

BEGIN CATCH

ROLLBACK TRANSACTION

--在執行完後去SELECT錯誤資訊
SELECT  
        --SELECT錯誤代碼
        ERROR_NUMBER() AS ErrorNumber  
        --SELECT錯誤行數
        ,ERROR_LINE() AS ErrorLine  
        --SELECT錯誤訊息
        ,ERROR_MESSAGE() AS ErrorMessage; 
		 
END CATCH

執行結果如下,可以看到第幾行、什麼錯誤都一清二楚。
https://ithelp.ithome.com.tw/upload/images/20171017/20106935XGUn70PzZ8.jpg

順便附上如果把SELECT錯誤資訊移到TRY中,執行沒有錯誤的結果,SQL如下:

BEGIN TRY

BEGIN 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 TRY

BEGIN CATCH

ROLLBACK TRANSACTION

END CATCH

執行結果如下,因為沒有錯誤,所以SELECT出NULL。
https://ithelp.ithome.com.tw/upload/images/20171017/201069357LzyqnmGnC.jpg

所以如果是使用這種方式,也可以利用SQL本身的ERROR_MESSAGE來獲得錯誤資訊!

不過我那天多遇到了一個問題,就是我的SQL組好後有好幾千行,而他的錯誤顯示在第兩千多行的地方,根本就無從找起...所以我順便找一下打開行數顯示的方法!

一般我們看到的SQL編輯區的左邊側欄會是空的:
https://ithelp.ithome.com.tw/upload/images/20171018/20106935jYuL3aJdmA.jpg

從上方的工具列點選「工具」→「選項」開啟以下視窗:
https://ithelp.ithome.com.tw/upload/images/20171018/20106935UevlqE8GRS.jpg
照著紅框依序點選「文字編輯器」→「所有語言」就到了上頭的畫面,勾選行號後,點選「確定」就大功告成!以下為設定完後的編輯視窗:
https://ithelp.ithome.com.tw/upload/images/20171018/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


尚未有邦友留言

立即登入留言