Tôi đang chạy sqlcmd từ một tệp bó và tôi đã tự hỏi làm thế nào để làm cho nó trả về một LRI khác 0 khi có sự cố với bản sao lưu.
Tôi đang chạy sqlcmd từ một tệp bó và tôi đã tự hỏi làm thế nào để làm cho nó trả về một LRI khác 0 khi có sự cố với bản sao lưu.
Câu trả lời:
Bạn nên sử dụng tùy chọn -b trong sqlcmd.
-b Chỉ định rằng sqlcmd thoát và trả về giá trị DOS ERRORLEVEL khi xảy ra lỗi. Giá trị được trả về biến DOS ERRORLEVEL là 1 khi thông báo lỗi Máy chủ SQL có mức độ nghiêm trọng lớn hơn 10; mặt khác, giá trị trả về là 0
Từ trang Tiện ích SQLCMD của MSDN tại: http://msdn.microsoft.com/en-us/l Library / ms162773.aspx
Nếu RAISERROR được sử dụng trong tập lệnh sqlcmd và trạng thái 127 được nâng lên, sqlcmd sẽ thoát và trả lại ID tin nhắn cho khách hàng. Ví dụ:
RAISERROR (50001, 10, 127)
Vì vậy, bạn có thể gói BACKUP DATABASE...
lệnh trong một TRY...CATCH
khối và đưa ra thông báo lỗi thích hợp, sqlcmd
sau đó sẽ trở lại tệp bó của bạn.
Ví dụ, xem xét các errorleveltest.sql
tập tin sau :
:ON ERROR EXIT
BEGIN TRY
/* creates error 3147 Backup and restore operations
are not allowed on database tempdb */
BACKUP DATABASE tempdb;
END TRY
BEGIN CATCH
DECLARE @msg NVARCHAR(255);
SET @msg = 'An error occurred: ' + ERROR_MESSAGE();
RAISERROR (50002, 10, 127);
END CATCH
Và tệp .bat sau: (dòng đầu tiên được gói để dễ đọc, nhưng cần phải nằm trên một dòng.)
@echo off
"C:\Program Files\Microsoft SQL Server\110\Tools\Binn\sqlcmd" -S "someinstance" -E
-i .\errorleveltest.sql
ECHO Errorlevel: %ERRORLEVEL%
Điều này trả về như sau từ dấu nhắc cmd.exe của tôi:
Msg 18054, Level 16, State 1, Server CP708-D377\MV, Line 9
Error 50002, severity 10, state 127 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.
Errorlevel: 1
Như bạn có thể thấy, ERRORLEVEL 1 được trả về thay vì giá trị trả về thông thường là 0. Tôi không thể lấy ERRORLEVEL để phản ánh số lỗi thực tế, trong trường hợp này là 50002; có lẽ có một vấn đề trong mã của tôi, hoặc có lẽ có một số vấn đề với môi trường của tôi.
ERRORLEVEL
không nên có cùng giá trị với Số lỗi được báo cáo từ SQL Server. ErrorNumber là một giá trị dành riêng cho SQL Server để cho biết lý do tại sao nó (tức là SQL Server) bị chấm dứt. Mặt khác, ERRORLEVEL
là một giá trị dành riêng cho SQLCMD để cho biết lý do tại sao nó (tức là SQLCMD) bị chấm dứt.