Bir toplu iş dosyasından sqlcmd kullanıyorum ve yedeklemede bir şeyler ters gittiğinde nasıl 0'dan farklı bir ERRORLEVEL döndüreceğini merak ediyorum.
Bir toplu iş dosyasından sqlcmd kullanıyorum ve yedeklemede bir şeyler ters gittiğinde nasıl 0'dan farklı bir ERRORLEVEL döndüreceğini merak ediyorum.
Yanıtlar:
-B seçeneğini sqlcmd olarak kullanmalısınız.
-b Sqlcmd'nin çıkıp bir hata oluştuğunda DOS ERRORLEVEL değeri döndürdüğünü belirtir. DOS ERRORLEVEL değişkenine döndürülen değer, SQL Server hata iletisi 10'dan büyük bir önem düzeyine sahip olduğunda 1'dir; Aksi takdirde döndürülen değer 0 olur.
MSDN SQLCMD Utility sayfasından: http://msdn.microsoft.com/en-us/library/ms162773.aspx
RAISERROR bir sqlcmd betiğinde kullanılırsa ve 127 durumu yükseltilirse, sqlcmd çıkıp mesaj kimliğini tekrar istemciye iade edecektir. Örneğin:
RAISERROR (50001, 10, 127)
Böylece BACKUP DATABASE...
komutu bir TRY...CATCH
bloğa sarabilir ve sqlcmd
daha sonra toplu iş dosyasına geri dönecek olan uygun hata mesajını yükseltebilirsiniz .
Örneğin, aşağıdaki errorleveltest.sql
dosyayı göz önünde bulundurun :
: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
Ve aşağıdaki .bat dosyası: (ilk satır okunabilirlik için sarılmış, ancak tek bir satırda olması gerekiyor.)
@echo off
"C:\Program Files\Microsoft SQL Server\110\Tools\Binn\sqlcmd" -S "someinstance" -E
-i .\errorleveltest.sql
ECHO Errorlevel: %ERRORLEVEL%
Bu benim cmd.exe isteminden aşağıdakileri döndürür:
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
Gördüğünüz gibi, 0 normal dönüş değeri yerine ERRORLEVEL 1 döndürülür. ERRORLEVEL 'in gerçek hata numarasını yansıtmasını sağlayamıyorum, bu durumda 50002; belki kodumda bir sorun var ya da belki çevremle ilgili bir sorun var.
ERRORLEVEL
SQL Server'dan bildirilen Hata Numarası ile aynı değerde olması beklenmemelidir. ErrorNumber, neden (yani SQL Server) sonlandırıldığını gösteren bir SQL Server'a özgü değerdir. Öte yandan, ERRORLEVEL
neden (yani SQLCMD) sonlandırıldığını belirten SQLCMD'ye özgü bir değerdir.