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
執行結果如下,可以看到第幾行、什麼錯誤都一清二楚。
順便附上如果把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。
所以如果是使用這種方式,也可以利用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