কীভাবে এসকিউএল স্ক্রিপ্ট কার্যকর করা যায়


16

আমি বর্গ স্ক্রিপ্টে কাজ করছি এবং কিছু শর্ত পূরণ না হলে আমার স্ক্রিপ্ট চালিয়ে যাওয়া বন্ধ করার প্রয়োজন রয়েছে।

আমি যখন এটি গুগল করি, আমি 20 তীব্রতার স্তরের সাথে রাইস এরর খুঁজে পেয়েছি যা এটি শেষ করে দেবে। তবে কিছু কারণে আমি এই বিকল্পটি ব্যবহার করতে পারি না।

এসকিউএল স্ক্রিপ্ট সম্পাদন বন্ধ করার সম্ভাব্য বিকল্পগুলি কী তা দয়া করে আমাকে সরবরাহ করতে পারেন।


1
ত্রুটি বাড়াতে কেন অগ্রহণযোগ্য? এছাড়াও এই স্ক্রিপ্ট একটি সঞ্চিত পদ্ধতি?
নামিবিবিয়ান

আপনার মুষ্টি প্রশ্নটি আমি স্পষ্টভাবে বুঝতে পারি নি। দ্বিতীয় প্রশ্নের জন্য; না এটি কোনও এসপি নয়
নতুন বিকাশকারী

1
লিপিটি কী? এটি একাধিক ব্যাচ গঠিত? আপনি উত্তর এখানে দেখেছেন?
মার্টিন স্মিথ

উত্তর:


8

থেকে 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পদ্ধতিটি আপনার পরিবেশের জন্য উপযুক্ত হয় তবে আপনি সেই পদ্ধতিটি ব্যবহার করতে পারেন ।



6

আপনি GOTOযেখানেই চান বিবৃতিটি এড়িয়ে যেতে পারেন। অন্য কথায়, আপনি একটি ত্রুটি বা অন্য কোনও শর্তে দৌড়ে যান এবং আপনার স্ক্রিপ্টের নীচে একটি লেবেল থাকতে পারে (অর্থাত্ TheEndOfTheScript:) এবং কেবল একটি goto TheEndOfTheScript;বিবৃতি জারি করতে পারেন ।

এখানে একটি দ্রুত নমুনা দেওয়া হল:

print 'here is the first statement...';

print 'here is the second statement...';

-- substitute whatever conditional flow determining factor
-- you'd like here. I have chosen a dummy statement that will
-- always return true
--
if (1 = 1)
    goto TheEndOfTheScript;

print 'here is the third statement...';

print 'here is the fourth statement...';


TheEndOfTheScript:
print 'here is the end of the script...';

এই নির্বাহের ফলাফলটি নিম্নলিখিত হবে:

here is the first statement...
here is the second statement...
here is the end of the script...

আপনি দেখতে পাচ্ছেন, GOTOতৃতীয় এবং চতুর্থ বিবৃতি মুদ্রণ এড়িয়ে গেছে এবং লেবেলের ডানদিকে লাফিয়ে গেছে ( TheEndOfTheScript)।


7
কেবলমাত্র যখন একটি একক ব্যাচ থাকবে তখনই কাজ করবে, আপনি জিও বিবৃতি দেওয়ার সাথে সাথেই তা ভেঙে যাবে।
গ্যাব্রিয়েল

4

0

SET NOEXEC ON/OFFস্টোরড প্রোকসগুলিতে (একক ব্লকযুক্ত) এর সাথে সম্মত হোন আমি কেবল RETURNবিবৃতি ব্যবহার করি ।

ক্যাভেটস: একটি স্ক্রিপ্ট ফাইলে, আপনার একাধিক GOবক্তব্য থাকলে, RETURNকেবলমাত্র বর্তমান ব্লকটি থেকে বেরিয়ে আসবে এবং পরবর্তী ব্লক / ব্যাচটি দিয়ে চালিয়ে যাবে।

দ্রষ্টব্য: GOTOএকটি খারাপ কোডিং অনুশীলন বলে মনে করা হচ্ছে, " TRY..CATCH" এর ব্যবহারের প্রস্তাব দেওয়া হয়, এটি এসকিউএল সার্ভার ২০০৮ সাল থেকে চালু হয়েছিল, এরপরে THROW২০১২ সালে এটি চালু হয়েছিল ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.