যখন এসকিএল স্ক্রিপ্ট ব্যর্থ হয় তখন কীভাবে স্ক্যেলকিমিডিকে 0 বাদে কোনও ERRORLEVEL ফেরত পাঠানো যায়?


38

আমি একটি ব্যাচ ফাইল থেকে sqlcmd চালাচ্ছি এবং ব্যাকআপের সাথে কিছু ভুল হয়ে যাওয়ার পরে 0 এর বাইরে অন্য কোনও ERRORLEVEL কীভাবে ফিরিয়ে আনতে হবে তা আমি ভাবছিলাম।


আপনি কি ব্যাচের ফাইলগুলির চেয়ে আরও শক্তিশালী কিছু (বিশেষত ত্রুটি পরিচালনা করার সময়) ব্যবহার করার বিষয়টি বিবেচনা করেছেন?
হারুন বারট্রান্ড

ওহ, আপনি পাওয়ারশেলের মতো বোঝাতে চান? আমরা যে পণ্যটি ব্যবহার করছি তার জন্য আমরা কেবল কোম্পানির সাথে প্রস্তাবিত পদ্ধতিতে যাচ্ছিলাম। সমস্যা হ'ল সুপারিশ পদ্ধতিটি ধরে নেওয়া হয় আপনি একটি ডাটাবেস ব্যাকআপ করছেন; তবে আমি সেই বাধা পেরিয়েছি। সুতরাং ব্যাকআপটি কাজ না করে কেবল এটির কোড নিক্ষেপ করার কোনও উপায় নেই?
leeand00

3
এটি আমার মূল্যবান কাজের জন্য, আমরা ওলা হ্যালেনগ্রেনের ব্যাকআপ সঞ্চিত পদ্ধতিগুলি ব্যবহার করি (তাদের আশেপাশে কিছু অভ্যন্তরীণ র‌্যাপার সঞ্চিত পদ্ধতি সহ) কয়েক হাজার সার্ভার জুড়ে হাজার হাজার ডাটাবেস ব্যাকআপ করতে এবং তাদের সাথে আমাদের কোনও সমস্যা হয়নি।
জেমস এল

উত্তর:


54

আপনার স্কেল সিএমডি-বি বিকল্পটি ব্যবহার করা উচিত।

-b উল্লেখ করে যে sqlcmd প্রস্থান করে এবং একটি ত্রুটি দেখা দিলে একটি ডস ERRORLEVEL মান প্রদান করে। ডস ERRORLEVEL ভেরিয়েবলের যে মানটি ফিরে আসে এসকিউএল সার্ভার ত্রুটি বার্তায় 10 এর চেয়ে তীব্রতার মাত্রা থাকে; অন্যথায়, প্রাপ্ত মান 0 হয়

http://msdn.microsoft.com/en-us/library/ms162773.aspx


10

এমএসডিএন এসকিউএলসিএমডি ইউটিলিটি পৃষ্ঠা থেকে: 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 পেতে পারি না; সম্ভবত আমার কোডে কোনও সমস্যা আছে বা আমার পরিবেশে সম্ভবত কিছু সমস্যা আছে।


1
আমি খুঁজে পেয়েছি যে যদি আপনি RAISERROR এর প্রথম প্যারামিটার হিসাবে একটি সংখ্যার মান সরবরাহ করেন তবে এটি কেবলমাত্র কাজ করে। উদাহরণস্বরূপ: এটি%% ত্রুটিযুক্ত% = 1 প্রদান করে: রেসরার (50002, 10,127) তবে এটি% ত্রুটিযুক্ত% = 0: RAISERROR ('myErrMsg।',

5
শেষ অনুচ্ছেদ সম্পর্কিত এফওয়াইআই: ERRORLEVELএসকিউএল সার্ভার থেকে ত্রুটি নম্বর হিসাবে রিপোর্ট করা সমান মান হিসাবে প্রত্যাশা করা উচিত নয়। এটির (যেমন এসকিউএল সার্ভার) কেন সমাপ্ত হয়েছে তা নির্দেশ করার জন্য ত্রুটি নম্বরটি একটি এসকিউএল সার্ভার-নির্দিষ্ট মান। অন্যদিকে, ERRORLEVELএটি (যেমন এসকিউএলসিএমডি) কেন বন্ধ করা হয়েছে তা নির্দেশ করার জন্য একটি এসকিউএলসিএমডি-নির্দিষ্ট মান।
সলোমন রুটজকি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.