আমি একটি ব্যাচ ফাইল থেকে sqlcmd চালাচ্ছি এবং ব্যাকআপের সাথে কিছু ভুল হয়ে যাওয়ার পরে 0 এর বাইরে অন্য কোনও ERRORLEVEL কীভাবে ফিরিয়ে আনতে হবে তা আমি ভাবছিলাম।
আমি একটি ব্যাচ ফাইল থেকে sqlcmd চালাচ্ছি এবং ব্যাকআপের সাথে কিছু ভুল হয়ে যাওয়ার পরে 0 এর বাইরে অন্য কোনও ERRORLEVEL কীভাবে ফিরিয়ে আনতে হবে তা আমি ভাবছিলাম।
উত্তর:
আপনার স্কেল সিএমডি-বি বিকল্পটি ব্যবহার করা উচিত।
-b উল্লেখ করে যে sqlcmd প্রস্থান করে এবং একটি ত্রুটি দেখা দিলে একটি ডস ERRORLEVEL মান প্রদান করে। ডস ERRORLEVEL ভেরিয়েবলের যে মানটি ফিরে আসে এসকিউএল সার্ভার ত্রুটি বার্তায় 10 এর চেয়ে তীব্রতার মাত্রা থাকে; অন্যথায়, প্রাপ্ত মান 0 হয়
এমএসডিএন এসকিউএলসিএমডি ইউটিলিটি পৃষ্ঠা থেকে: http ://msdn.mic Microsoft.com/en-us/library/ms162773.aspx
যদি RAISERROR ব্যবহার করা হয় এবং যদি একটি স্ক্যল সিএমডি স্ক্রিপ্টের মধ্যে ব্যবহার করা হয় এবং 127 এর রাজ্য উত্থাপিত হয় তবে sqlcmd প্রস্থান করবে এবং বার্তা আইডি ক্লায়েন্টকে ফিরিয়ে দেবে। উদাহরণ স্বরূপ:
RAISERROR (50001, 10, 127)
সুতরাং আপনি BACKUP DATABASE...
একটি TRY...CATCH
ব্লকে কমান্ডটি মোড়ানো করতে পারেন এবং যথাযথ ত্রুটি বার্তাটি উত্থাপন করতে sqlcmd
পারেন , যা আপনার ব্যাচের ফাইলে ফিরে আসবে।
উদাহরণস্বরূপ, নিম্নলিখিত errorleveltest.sql
ফাইলটি বিবেচনা করুন:
: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
এবং নিম্নলিখিত .bat ফাইল: (পঠনযোগ্যতার জন্য প্রথম লাইনটি মোড়ানো আছে তবে একটি একক লাইনে থাকা দরকার))
@echo off
"C:\Program Files\Microsoft SQL Server\110\Tools\Binn\sqlcmd" -S "someinstance" -E
-i .\errorleveltest.sql
ECHO Errorlevel: %ERRORLEVEL%
এটি আমার cmd.exe প্রম্পট থেকে নিম্নলিখিতটি ফেরত দেয়:
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
আপনি দেখতে পাচ্ছেন, 0 এর স্বাভাবিক রিটার্ন মানটির পরিবর্তে এররলভেল 1 ফিরে আসবে আমি এই ক্ষেত্রে 50002; আসল ত্রুটি নম্বর প্রতিফলিত করতে ERRORLEVEL পেতে পারি না; সম্ভবত আমার কোডে কোনও সমস্যা আছে বা আমার পরিবেশে সম্ভবত কিছু সমস্যা আছে।
ERRORLEVEL
এসকিউএল সার্ভার থেকে ত্রুটি নম্বর হিসাবে রিপোর্ট করা সমান মান হিসাবে প্রত্যাশা করা উচিত নয়। এটির (যেমন এসকিউএল সার্ভার) কেন সমাপ্ত হয়েছে তা নির্দেশ করার জন্য ত্রুটি নম্বরটি একটি এসকিউএল সার্ভার-নির্দিষ্ট মান। অন্যদিকে, ERRORLEVEL
এটি (যেমন এসকিউএলসিএমডি) কেন বন্ধ করা হয়েছে তা নির্দেশ করার জন্য একটি এসকিউএলসিএমডি-নির্দিষ্ট মান।