থেকে RAISERROR ডকুমেন্টেশন (জোর খনি):
0 থেকে 18 এর মধ্যে তীব্রতা স্তরগুলি যে কোনও ব্যবহারকারীর দ্বারা নির্দিষ্ট করা যেতে পারে। 19 থেকে 25 এর মধ্যে তীব্রতার মাত্রাগুলি কেবল সিসাদমিন ফিক্সড সার্ভার রোলের সদস্য বা বিকল্প ট্র্যাকের অনুমতি সহ ব্যবহারকারীদের দ্বারা নির্দিষ্ট করা যেতে পারে। 19 থেকে 25 এর মধ্যে তীব্রতার স্তরের জন্য, লগের সাথে বিকল্প বিকল্প প্রয়োজন option
সম্ভবত আপনি যে স্ক্রিপ্টটি এই মানদণ্ডের সাথে মেলে না তেমন প্রিন্সিপাল হচ্ছেন।
ব্যবহারে কোনও ভুল নেই RAISERROR
; আপনি মাত্রাতিরিক্ত অত্যধিক তীব্রতার স্তরটি ব্যবহার করছেন। উত্থাপিত একটি ত্রুটির জন্য আমি ডিফল্ট হিসাবে স্তর 16 ব্যবহার করি এবং ক্রমটি সমাপ্ত হবে। আপনি যদি আরও সঠিক হতে চান তবে আপনি মাইক্রোসফ্ট নিজেই যে স্তরগুলি দিয়েছেন তা অনুসরণ করতে পারেন:
এখন, সমস্ত কিছু বলা, স্ক্রিপ্টের প্রেক্ষাপটের উপর নির্ভর করে ব্যবহার RAISERROR
করা যথেষ্ট নাও হতে পারে, কারণ এটি নিজে থেকে স্ক্রিপ্টটি "প্রস্থান" করে না (সাধারণ তীব্রতা স্তরগুলি ব্যবহার করে)।
উদাহরণ স্বরূপ:
RAISERROR(N'Test', 16, 1);
SELECT 1; /* Executed! */
এটি উভয়ই ত্রুটি বাড়াবে এবং ফলাফলের সেটটি ফিরিয়ে দেবে।
স্ক্রিপ্টটি অবিলম্বে শেষ করতে, আমি ব্যবহার করতে পছন্দ করি RETURN
( GOTO
বেশিরভাগ প্রোগ্রামিং সার্কেলগুলিতে বিকল্পের উপস্থিতিতে সাধারণত টাইপ কনস্ট্রাক্টগুলি নিরুত্সাহিত করা হয়):
RAISERROR(N'Test', 16, 1);
RETURN;
SELECT 1; /* Not executed */
বা ত্রুটিটি ব্যবহার করে পরিচালনা করুন TRY/CATCH
, যার CATCH
ফলে তীব্রতা 11 বা তার বেশি হলে ব্লকটিতে মৃত্যুদন্ড কার্যকর হবে :
BEGIN TRY
RAISERROR(N'Test', 16, 1);
SELECT 1; /* Not executed */
END TRY
BEGIN CATCH
SELECT 2; /* Executed */
END CATCH
BEGIN TRY
RAISERROR(N'Test', 10, 1);
SELECT 1; /* Executed */
END TRY
BEGIN CATCH
SELECT 2; /* Not executed */
END CATCH
একটি পৃথক সমস্যা হ'ল স্ক্রিপ্টটি একাধিক ব্যাচ বিস্তৃত - RETURN
কেবলমাত্র ব্যাচ থেকে প্রস্থান করবে :
RAISERROR(N'Test', 16, 1);
RETURN;
SELECT 1; /* Not executed */
GO
SELECT 2; /* Executed! */
এটি ঠিক করতে, আপনি @@ERROR
প্রতিটি ব্যাচের শুরুতে পরীক্ষা করতে পারেন :
RAISERROR(N'Test', 16, 1);
RETURN;
SELECT 1; /* Not executed */
GO
IF (@@ERROR != 0)
RETURN;
SELECT 2; /* Not executed */
সম্পাদনা: মার্টিন স্মিথ মন্তব্যগুলিতে সঠিকভাবে উল্লেখ করেছেন, এটি কেবল 2 টি ব্যাচের পক্ষে কাজ করে। 3 বা ততোধিক ব্যাচ পর্যন্ত প্রসারিত করতে, আপনি ত্রুটি বাড়ানোর ক্ষেত্রে ক্যাসকেড করতে পারেন (দ্রষ্টব্য: GOTO
পদ্ধতিটি এই সমস্যার সমাধান করে না কারণ লক্ষ্য লেবেলটি ব্যাচের মধ্যে সংজ্ঞায়িত করা আবশ্যক):
RAISERROR(N'Test', 16, 1);
RETURN;
SELECT 1; /* Not executed */
GO
IF (@@ERROR != 0)
BEGIN
RAISERROR(N'Error already raised. See previous errors.', 16, 1);
RETURN;
END
SELECT 2; /* Not executed */
GO
IF (@@ERROR != 0)
BEGIN
RAISERROR(N'Error already raised. See previous errors.', 16, 1);
RETURN;
END
SELECT 3; /* Not executed */
অথবা, যেমনটি তিনি উল্লেখ করেছেন, আপনি যদি SQLCMD
পদ্ধতিটি আপনার পরিবেশের জন্য উপযুক্ত হয় তবে আপনি সেই পদ্ধতিটি ব্যবহার করতে পারেন ।