এসকিউএল সার্ভার - একটি এসকিউএল স্ক্রিপ্ট কার্যকর বা বন্ধ করুন stop


325

"ব্রেক" বা "প্রস্থান" কমান্ডের মতো এসকিউএল সার্ভারে কোনও এসকিউএল স্ক্রিপ্টের তাত্ক্ষণিকভাবে বন্ধ করার কোনও উপায় আছে?

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

উত্তর:


371

raiserror পদ্ধতি

raiserror('Oh no a fatal error', 20, -1) with log

এটি সংযোগটি শেষ করবে, এর ফলে বাকী স্ক্রিপ্টটি চলমান থেকে থামবে।

মনে রাখবেন যে তীব্রতা স্তর 20 বা উচ্চতর এবং WITH LOGবিকল্পটি এটি এইভাবে কাজ করার জন্য প্রয়োজনীয়।

এটি এমনকি জিও স্টেটমেন্টগুলির সাথেও কাজ করে।

print 'hi'
go
raiserror('Oh no a fatal error', 20, -1) with log
go
print 'ho'

আপনাকে আউটপুট দেবে:

hi
Msg 2745, Level 16, State 2, Line 1
Process ID 51 has raised user error 50000, severity 20. SQL Server is terminating this process.
Msg 50000, Level 20, State 1, Line 1
Oh no a fatal error
Msg 0, Level 20, State 0, Line 0
A severe error occurred on the current command.  The results, if any, should be discarded.

লক্ষ্য করুন যে 'হো' মুদ্রিত হয়নি।

আদেশ সহকারে:

  • এটি কেবলমাত্র তখনই কার্যকর হয় যদি আপনি অ্যাডমিন হিসাবে লগইন হন ('সিসাদমিন' ভূমিকা), এবং আপনাকে কোনও ডাটাবেস সংযোগ না রেখে দেয়।
  • আপনি যদি অ্যাডমিন হিসাবে লগ ইন না হয়ে থাকেন তবে রাইসিরআর () কলটি নিজেই ব্যর্থ হবে এবং স্ক্রিপ্টটি চালিয়ে যাওয়া চালিয়ে যাবে
  • যখন sqlcmd.exe সহ আহ্বান করা হবে, প্রস্থান কোড 2745 প্রতিবেদন করা হবে।

তথ্যসূত্র: http://www.mydatediasupport.com/forums/ms-sqlserver/174037-sql-server-2000-abort- whole-script.html# post761334

নোেক্সেক পদ্ধতি

জিও স্টেটমেন্টগুলির সাথে কাজ করে এমন আরেকটি পদ্ধতি set noexec on। এর ফলে বাকী স্ক্রিপ্টটি বাদ পড়ে যায়। এটি সংযোগটি শেষ করে না, তবে noexecকোনও আদেশ কার্যকর হওয়ার আগে আপনাকে আবার বন্ধ করতে হবে।

উদাহরণ:

print 'hi'
go

print 'Fatal error, script will not continue!'
set noexec on

print 'ho'
go

-- last line of the script
set noexec off -- Turn execution back on; only needed in SSMS, so as to be able 
               -- to run this script again in the same session.

14
সেটা খুবই ভালো! এটি "বিগ স্টিক" পদ্ধতির কিছুটা হলেও, এমন সময় আসে যখন আপনার সত্যই এটি প্রয়োজন হয়। মনে রাখবেন যে এর জন্য তীব্রতা 20 (বা উচ্চতর) এবং "লগ সহ" উভয়ই প্রয়োজন।
রব গ্যারিসন

5
নোট করুন যে নেক্সেক পদ্ধতিতে বাকী স্ক্রিপ্টটি এখনও ব্যাখ্যা করা হয়েছে, সুতরাং আপনি এখনও সংকলন-সময় ত্রুটিগুলি পাবেন, যেমন কলামের অস্তিত্ব নেই। যদি আপনি শর্তসাপেক্ষে কিছু কোড বাদ দিয়ে কলাম অনুপস্থিত জড়িত পরিচিত স্কিমা পরিবর্তনগুলি মোকাবেলা করতে চান তবে আমি কেবল এটি করতে পারি তা হ'ল বাহ্যিক ফাইলগুলি রেফারেন্স করার জন্য sqlcommand মোডে r।
ডেভিড আইসন

20
অযৌক্তিক জিনিসটি দুর্দান্ত। অনেক ধন্যবাদ!
গ্যাসপা79

2
"এটি সংযোগটি শেষ করে দেবে" - মনে হচ্ছে এটি হয় না, কমপক্ষে আমি যা দেখছি।
jcollum

6
আমি এই পদ্ধতিটি চেষ্টা করছিলাম এবং আমি যখন বুঝতে পারলাম সঠিক ফলাফল পাচ্ছিলাম না ... রেজারারে কেবল একটি ই আছে ...
ববকিংফ 12v 15

187

কেবলমাত্র একটি রিটার্ন ব্যবহার করুন (এটি কোনও সঞ্চিত পদ্ধতির অভ্যন্তরে এবং বাইরে উভয় ক্ষেত্রেই কাজ করবে)।


2
কোনও কারণে, আমি ভেবেছিলাম যে রিটার্ন স্ক্রিপ্টগুলিতে কাজ করে না, তবে আমি কেবল এটি চেষ্টা করেছি, এবং এটি করে! ধন্যবাদ
অ্যান্ডি হোয়াইট

4
কোনও স্ক্রিপ্টে, আপনি কোনও স্টোরড পদ্ধতিতে আপনার মতো মান দিয়ে রিটার্ন করতে পারবেন না, তবে আপনি রিটার্নও করতে পারেন।
রব গ্যারিসন

53
না এটি কেবল পরবর্তী জিও অবধি সমাপ্ত হবে না পরবর্তী ব্যাচটি (জিও এর পরে) যথারীতি চলবে
মার্টব

2
এটি পরবর্তী জিও এর পরেও চলবে বলে ধরে নেওয়া বিপজ্জনক।
জাস্টিন 4

1
জিও হ'ল স্ক্রিপ্ট টার্মিনেটর বা ডিলিমিটার; এটি এসকিউএল কোড নয়। আপনি যে ক্লায়েন্টকে ডাটাবেস ইঞ্জিনে কমান্ড প্রেরণের জন্য ব্যবহার করছেন সেটি জিও হ'ল একটি নির্দেশ মাত্র যা জিও ডিলিমিটারের পরে নতুন স্ক্রিপ্ট শুরু হয়।
24:37

50

আপনি যদি এসকিউএলসিএমডি মোড ব্যবহার করতে পারেন তবে তা প্রসারণ

:on error exit

(কোলন অন্তর্ভুক্ত) RAISERROR আসলে স্ক্রিপ্ট থামাতে হবে। যেমন,

:on error exit

IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[SOMETABLE]') AND type in (N'U')) 
    RaisError ('This is not a Valid Instance Database', 15, 10)
GO

print 'Keep Working'

আউটপুট হবে:

Msg 50000, Level 15, State 10, Line 3
This is not a Valid Instance Database
** An error was encountered during execution of batch. Exiting.

এবং ব্যাচটি থামবে। যদি এসকিউএলসিএমডি মোডটি চালু না করা থাকে তবে আপনি কোলন সম্পর্কে বিশ্লেষণ ত্রুটি পাবেন। দুর্ভাগ্যক্রমে, এটি সম্পূর্ণরূপে বুলেটপ্রুফ নয় যেমন এসকিউএলসিএমডি মোডে না হয়ে স্ক্রিপ্টটি চালিত হয়, এসকিউএল ম্যানেজমেন্ট স্টুডিও সঠিক সময়ের অতীতকে বিশ্লেষণ করেও সময়কে ত্রুটিযুক্ত করে! তবুও, আপনি যদি তাদের কমান্ড লাইন থেকে চালাচ্ছেন তবে এটি ঠিক আছে।


4
দুর্দান্ত মন্তব্য, ধন্যবাদ। আমি এটি যোগ করব এসএসএমএস এসকিউএলসিএমডি মোডে ক্যোরি মেনুতে টগল করা।
ডেভিড পিটার্স

এটি দরকারী - এর অর্থ চলমান চলাকালীন আপনাকে -b বিকল্পের প্রয়োজন হবে না
জনিআআআআআআআআআআআআআআআআআআআআআআআআরআরআরআবি ساتھ'আর

2
তারপরে প্রসারণ ... তবে আমি কীভাবে যাদু মিসেল নিক্ষেপ করব ?!
জেজেএস

1
নিখুঁত।
সিসাদমিনের

21

আমি RAISERROR ব্যবহার করব না- এসকিউএল এর কাছে যদি বিবৃতি থাকে যা এই উদ্দেশ্যে ব্যবহার করা যেতে পারে। আপনার বৈধতা এবং অনুসন্ধান করুন এবং স্থানীয় ভেরিয়েবলগুলি সেট করুন, তারপরে সন্নিবেশকে শর্তযুক্ত করার জন্য যদি বিবৃতিতে ভেরিয়েবলের মান ব্যবহার করুন।

আপনার প্রতিটি বৈধতা পরীক্ষার একটি পরিবর্তনশীল ফলাফল পরীক্ষা করার প্রয়োজন হবে না। সমস্ত শর্ত পেরিয়ে যাওয়ার বিষয়টি নিশ্চিত করতে আপনি কেবলমাত্র একটি পতাকা চলক দিয়ে এটি করতে পারেন:

declare @valid bit

set @valid = 1

if -- Condition(s)
begin
  print 'Condition(s) failed.'
  set @valid = 0
end

-- Additional validation with similar structure

-- Final check that validation passed
if @valid = 1
begin
  print 'Validation succeeded.'

  -- Do work
end

এমনকি যদি আপনার বৈধতা আরও জটিল হয় তবে আপনার চূড়ান্ত চেকগুলিতে অন্তর্ভুক্ত করার জন্য আপনার কয়েকটি ফ্ল্যাগ ভেরিয়েবলের প্রয়োজন should


হ্যাঁ, আমি স্ক্রিপ্টের অন্যান্য অংশগুলিতে আইএফ ব্যবহার করছি তবে সন্নিবেশ করার চেষ্টা করার আগে আমি প্রতিটি স্থানীয় পরিবর্তনশীল পরীক্ষা করতে চাই না। আমি বরং পুরো স্ক্রিপ্টটি থামাতে চাইতাম এবং ব্যবহারকারীকে ইনপুটগুলি পরীক্ষা করতে বাধ্য করতাম। (এটি কেবল একটি দ্রুত এবং নোংরা স্ক্রিপ্ট)
অ্যান্ডি হোয়াইট

4
পোস্টারটি "চায়" কি করতে পারে তা নয়, এটি কেন প্রযুক্তিগতভাবে সঠিক বলে এই উত্তরটি কেন চিহ্নিত করা হয়েছে তা আমি নিশ্চিত নই।
জন স্যানসোম

বিগিন..এন্ডের মধ্যে কি একাধিক ব্লক থাকা সম্ভব? অর্থ STATEMENT; যাওয়া; বিবৃতি; যাওয়া; ইত্যাদি ইত্যাদি? আমি ত্রুটি পাচ্ছি এবং আমার ধারণা এটির কারণ হতে পারে।
Nenotlep

3
এটি তুলনায় অনেক বেশি নির্ভরযোগ্য RAISERROR, বিশেষত যদি আপনি না জানেন যে স্ক্রিপ্টগুলি কে পরিচালনা করছে এবং কোন সুবিধাগুলি রয়েছে।
সাইফার

@ জন সানসোম: আমি এখানে কেবলমাত্র সমস্যাটি দেখছি যে আপনি যদি কোনও জিও স্টেটমেন্টের শাখা লেখার চেষ্টা করছেন তবে আইএফ স্টেটমেন্টটি কাজ করে না। আপনার স্ক্রিপ্টগুলি জিও স্টেটমেন্টগুলিতে নির্ভর করে যদি (যেমন ডিডিএল স্টেটমেন্ট)। এখানে একটি উদাহরণ যা প্রথম গো বিবৃতি ছাড়াই কাজ করে :declare @i int = 0; if @i=0 begin select '1st stmt in IF block' go end else begin select 'ELSE here' end go
জেমস জেনসেন

16

এসকিউএল 2012+, আপনি ব্যবহার করতে পারেন নিক্ষেপ

THROW 51000, 'Stopping execution because validation failed.', 0;
PRINT 'Still Executing'; -- This doesn't execute with THROW

এমএসডিএন থেকে:

একটি ব্যতিক্রম উত্থাপন করে এবং ট্রায়ালটির ক্যাচ ব্লকে এক্সিকিউশন হস্তান্তর করে ... ক্যাচ কনস্ট্রাক্ট ... যদি ট্রাই ... ক্যাচ কনস্ট্রাক্ট পাওয়া না যায় তবে সেশনটি শেষ হয়। লাইন নম্বর এবং পদ্ধতি যেখানে ব্যতিক্রম উত্থাপিত হয় সেট করা হয়। তীব্রতা 16 এ সেট করা হয়েছে।


1
RAIDERROR প্রতিস্থাপনের জন্য থ্রো বোঝানো হয়েছে, তবে আপনি একই স্ক্রিপ্ট ফাইলে পরবর্তী ব্যাচগুলি এটির সাথে আটকাতে পারবেন না।
এনআরিলিংহ

সঠিক @ এনআরিলিংহ সেখানেই ব্লারগার্ডের উত্তরটি হ'ল একমাত্র সমাধান। এর জন্য সিসাদমিন প্রয়োজন, যদিও (তীব্রতা স্তর 20), এবং স্ক্রিপ্টে একাধিক ব্যাচ না থাকলে এটি মোটামুটি ভারী।
জর্দান পার্কার

2
আপনি যদি বর্তমান ট্রান্সকেশনটিও বাতিল করতে চান তবে এক্সএ্যাকট বিসর্জন সেট করুন।
নুরেটিন

13

আমি নেক্সেক অন / অফ সলিউশনটিকে সফলভাবে লেনদেনের সাথে সম্পূর্ণ বা কিছুই না স্ক্রিপ্টটি চালানোর জন্য প্রসারিত করেছি।

set noexec off

begin transaction
go

<First batch, do something here>
go
if @@error != 0 set noexec on;

<Second batch, do something here>
go
if @@error != 0 set noexec on;

<... etc>

declare @finished bit;
set @finished = 1;

SET noexec off;

IF @finished = 1
BEGIN
    PRINT 'Committing changes'
    COMMIT TRANSACTION
END
ELSE
BEGIN
    PRINT 'Errors occured. Rolling back changes'
    ROLLBACK TRANSACTION
END

স্পষ্টতই সংকলক যদি আইএফ-তে @ সংজ্ঞায়িত পরিবর্তনশীলটিকে "বোঝে", তবুও কোনও ত্রুটি ছিল এবং সম্পাদন অক্ষম ছিল। তবে, এক্সিকিউশনটি অক্ষম না করা হলে মানটি 1 এ সেট করা হয়। অতএব আমি সেইভাবে লেনদেনটি সুন্দরভাবে করতে বা রোলব্যাক করতে পারি।


আমি বুঝতে পারছি না. আমি নির্দেশাবলী অনুসরণ। আমি প্রতিটি জিও এর পরে নিম্নলিখিত এসকিউএল প্রবেশ করলাম। IF (XACT_STATE()) <> 1 BEGIN Set NOCOUNT OFF ;THROW 525600, 'Rolling back transaction.', 1 ROLLBACK TRANSACTION; set noexec on END; কিন্তু মৃত্যুদন্ড কার্যকর করা কখনই থামেনি, এবং আমি তিনটি "রোলিং ব্যাক ট্রানজেকশন" এর ত্রুটিগুলি উত্থাপন করে শেষ করেছি। কোন ধারনা?
ব্যবহারকারী 1161391

12

আপনি আপনার এসকিউএল স্টেটমেন্টটি WHIL লুপে মোড়াতে পারেন এবং প্রয়োজনে BREAK ব্যবহার করতে পারেন

WHILE 1 = 1
BEGIN
   -- Do work here
   -- If you need to stop execution then use a BREAK


    BREAK; --Make sure to have this break at the end to prevent infinite loop
END

5
আমি এক ধরনের চেহারা মত, এটি ত্রুটি বাড়াতে চেয়ে একটু সুন্দর মনে হয়। শেষ পর্যন্ত বিরতিটি ভুলতে ভুলবেন না!
অ্যান্ডি হোয়াইট

1
"বিভাজন" এড়ানোর জন্য আপনি একটি পরিবর্তনশীল ব্যবহার করতে এবং তা অবিলম্বে লুপের শীর্ষে সেট করতে পারেন। DECLARE @ST INT; SET @ST = 1; WHILE @ST = 1; BEGIN; SET @ST = 0; ...; ENDআরও ভার্বোস, তবে হেক, এটি যাইহোক টিএসকিউএল ;-)

কিছু লোক এভাবেই গোটো সম্পাদন করে তবে গোটোর চেয়ে এটি অনুসরণ করা আরও বিভ্রান্তিকর।
নুরেটিন

এই পদ্ধতির অপ্রত্যাশিত মাঝে মাঝে জিও থেকে সুরক্ষা দেয়। গুণগ্রাহী।
it3xl

10

আপনি GOTO বিবৃতি ব্যবহার করে মৃত্যুদন্ড কার্যকর করতে পারেন :

IF @ValidationResult = 0
BEGIN
    PRINT 'Validation fault.'
    GOTO EndScript
END

/* our code */

EndScript:

2
গোটো ব্যবহার ব্যতিক্রম হ্যান্ডেল করার একটি গ্রহণযোগ্য উপায়। ভেরিয়েবল এবং নেস্টিংয়ের পরিমাণ হ্রাস করে এবং সংযোগ বিচ্ছিন্ন করে না। এটি সম্ভবত এসকিউএল সার্ভারের স্ক্রিপ্টিং মঞ্জুরি দেয় প্রত্নতাত্ত্বিক ব্যতিক্রম হ্যান্ডলিংয়ের চেয়ে পছন্দনীয়।
আন্তোনিও ড্রুসিন

এখানে অন্যান্য সমস্ত পরামর্শের মতোই, "আমাদের কোডে" একটি "যান" বিবৃতি থাকলে এটি কাজ করে না।
মাইক গ্লেডহিল

9

SvcCMD মোড ব্যবহার করার জন্য উপরের রেখাগুলি পুনরায় সংশোধন করুন চশমা পদ্ধতিটি, এবং হয় এসকিউএলসিএমডি মোড ব্যবহার না করে অথবা :on error exitকোনও ত্রুটিতে প্রস্থান করার জন্য ব্যবহার করে তবে স্ক্রিপ্টটি কাঁপিয়ে তোলে
CONTEXT_INFO রাষ্ট্রটির উপর নজর রাখার জন্য ব্যবহৃত হয়।

SET CONTEXT_INFO  0x1 --Just to make sure everything's ok
GO 
--treminate the script on any error. (Requires SQLCMD mode)
:on error exit 
--If not in SQLCMD mode the above line will generate an error, so the next line won't hit
SET CONTEXT_INFO 0x2
GO
--make sure to use SQLCMD mode ( :on error needs that)
IF CONTEXT_INFO()<>0x2 
BEGIN
    SELECT CONTEXT_INFO()
    SELECT 'This script must be run in SQLCMD mode! (To enable it go to (Management Studio) Query->SQLCMD mode)\nPlease abort the script!'
    RAISERROR('This script must be run in SQLCMD mode! (To enable it go to (Management Studio) Query->SQLCMD mode)\nPlease abort the script!',16,1) WITH NOWAIT 
    WAITFOR DELAY '02:00'; --wait for the user to read the message, and terminate the script manually
END
GO

----------------------------------------------------------------------------------
----THE ACTUAL SCRIPT BEGINS HERE-------------

2
স্ক্রিপ্টটি বাতিল করতে না পেরে এসএসএমএসের উন্মাদনার আশেপাশে কাজ করার একমাত্র উপায় এটি। তবে আমি শুরুতে 'SET NOEXEC OFF' যুক্ত করেছি এবং এসকিউএলসিএমডি মোডে না থাকলে 'সেট সেট নোক্সেক চালু' করব, অন্যথায় লগ সহ 20 স্তরে কোনও ত্রুটি না বাড়ানো পর্যন্ত আসল স্ক্রিপ্টটি চলতে থাকবে।
মার্ক সোউল

8

এটি কি সঞ্চিত পদ্ধতি? যদি তা হয়, তবে আমি মনে করি আপনি কেবল একটি রিটার্ন করতে পারেন, যেমন "রিটার্ন নাল";


উত্তরের জন্য ধন্যবাদ, এটি জেনে রাখা ভাল তবে এই ক্ষেত্রে এটি কোনও সঞ্চিত সংগ্রহ নয়, কেবল একটি স্ক্রিপ্ট ফাইল
অ্যান্ডি হোয়াইট

1
@ গর্ডন সর্বদা নয় (এখানে আমি অনুসন্ধান করছি)। অন্যান্য উত্তরগুলি দেখুন (একটি জিনিসটির জন্য এটি এগিয়ে যান)
মার্ক সোওল

6

আমি আপনাকে পরামর্শ দিচ্ছি যে আপনি আপনার যথাযথ কোড ব্লকটি চেষ্টা করে দেখুন block এরপরে আপনি ইচ্ছুক হলে ক্যাচ ব্লকে ব্রেক করতে 11 এর তীব্রতার সাথে রাইজারের ইভেন্টটি ব্যবহার করতে পারেন। যদি আপনি কেবল কৃপণতা করতে চান তবে চেষ্টা ব্লকের মধ্যে সম্পাদন চালিয়ে যান তবে একটি তীব্রতা কম ব্যবহার করুন।

ধারণা তৈরী কর?

চিয়ার্স, জন

[বিওএল রেফারেন্স অন্তর্ভুক্ত করার জন্য সম্পাদিত]

http://msdn.microsoft.com/en-us/library/ms175976(SQL.90).aspx


আমি এসকিউএল-তে কখনও চেষ্টা করে দেখিনি - আপনি কী বোঝাতে চাইছেন তাড়াতাড়ি পোস্ট করার বিষয়ে কি আপত্তি হবে?
অ্যান্ডি হোয়াইট

2
এটি 2005 এ নতুন B TRY {sql_statement শুরু করুন বিবৃতি_ব্লক} শেষ চেষ্টা শুরু করুন ক্যাচ q বর্গ_ স্টেটমেন্ট | বিবৃতি_ব্লক} শেষ ক্যাচ [; ]
স্যাম

@ অ্যান্ডি: রেফারেন্স যুক্ত, উদাহরণ অন্তর্ভুক্ত।
জন স্যানসম

2
ট্রাই-ক্যাচ ব্লক এর ভিতরে যাওয়ার অনুমতি দেয় না।
অ্যান্টোনকে

4

আপনি RAISERROR ব্যবহার করতে পারেন ।


3
এটি আমার কাছে কোনও তাত্পর্যপূর্ণ নয়- একটি এড়ানো যায় এমন ত্রুটি বাড়ানো (ধরে নেওয়া আমরা এখানে রেফারেন্সিয়াল বৈধতার কথা বলছি) সন্নিবেশগুলি গ্রহণের আগে বৈধতা পাওয়া সম্ভব হলে এটি করার একটি ভয়ঙ্কর উপায়।
ডেভ সোয়ারস্কি

2
রেজারার কম তীব্রতার সেটিং সহ একটি তথ্য বার্তা হিসাবে ব্যবহার করা যেতে পারে।
ম্লাদেন প্রজাদিক

2
গৃহীত উত্তরে বর্ণিত কিছু শর্ত পূরণ না করা পর্যন্ত স্ক্রিপ্টটি চলতে থাকবে।
এরিক জে

4

এগুলির কোনওটিই 'Go' বিবৃতি নিয়ে কাজ করে না। এই কোডটিতে, তীব্রতা 10 বা 11 নয় নির্বিশেষে, আপনি চূড়ান্ত PRINT বিবৃতি পাবেন।

পরীক্ষার স্ক্রিপ্ট:

-- =================================
PRINT 'Start Test 1 - RAISERROR'

IF 1 = 1 BEGIN
    RAISERROR('Error 1, level 11', 11, 1)
    RETURN
END

IF 1 = 1 BEGIN
    RAISERROR('Error 2, level 11', 11, 1)
    RETURN
END
GO

PRINT 'Test 1 - After GO'
GO

-- =================================
PRINT 'Start Test 2 - Try/Catch'

BEGIN TRY
    SELECT (1 / 0) AS CauseError
END TRY
BEGIN CATCH
    SELECT ERROR_MESSAGE() AS ErrorMessage
    RAISERROR('Error in TRY, level 11', 11, 1)
    RETURN
END CATCH
GO

PRINT 'Test 2 - After GO'
GO

ফলাফল:

Start Test 1 - RAISERROR
Msg 50000, Level 11, State 1, Line 5
Error 1, level 11
Test 1 - After GO
Start Test 2 - Try/Catch
 CauseError
-----------

ErrorMessage
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Divide by zero error encountered.

Msg 50000, Level 11, State 1, Line 10
Error in TRY, level 11
Test 2 - After GO

এই কাজটি করার একমাত্র উপায় হ'ল GOবিবৃতি ছাড়াই স্ক্রিপ্ট লেখা । কখনও কখনও এটি সহজ। কখনও কখনও এটি বেশ কঠিন। (এর মতো কিছু ব্যবহার করুন IF @error <> 0 BEGIN ...))


তৈরি প্রক্রিয়া ইত্যাদি দিয়ে এটি করতে পারে না কোনও সমাধানের জন্য আমার উত্তর দেখুন।
ব্লারগবার্ড

ব্লগবার্ডের সমাধানটি দুর্দান্ত। আমি বছরের পর বছর ধরে এসকিউএল সার্ভারের সাথে কাজ করছি এবং এটি আমি এই প্রথম দেখি।
রব গ্যারিসন

4

আমি RETURNএখানে সব সময় ব্যবহার করি , স্ক্রিপ্টে বা কাজ করিStored Procedure

নিশ্চিত হন যে আপনি ROLLBACKযদি লেনদেন করেন তবে তা RETURNঅবিলম্বে একটি মুক্ত অনির্বাচিত লেনদেনের ফলাফল হবে


5
একাধিক ব্যাচ (জিও স্টেটমেন্ট) সমন্বিত কোনও স্ক্রিপ্ট নিয়ে কাজ করে না - এটি কীভাবে করতে হয় তার জন্য আমার উত্তর দেখুন।
ব্লারগবার্ড

1
প্রত্যাবর্তন কেবল বিবৃতিগুলির বর্তমান ব্লক থেকে বেরিয়ে আসে। আপনি যদি একটি আইএফ এন্ড ব্লকে থাকেন তবে শেষের পরেও কার্যকর করা চলবে। এর অর্থ আপনি কিছু শর্ত পরীক্ষার পরে মৃত্যুদণ্ড শেষ করতে রিটার্ন ব্যবহার করতে পারবেন না, কারণ আপনি সর্বদা আইএফ অব ব্লকে থাকবেন।
সিডনার


3

আপনি গোটো স্টেটমেন্ট ব্যবহার করতে পারেন। এটা চেষ্টা কর. এটি আপনার জন্য পূর্ণ ব্যবহার।

WHILE(@N <= @Count)
BEGIN
    GOTO FinalStateMent;
END

FinalStatement:
     Select @CoumnName from TableName

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

1

উত্তরের জন্য থেক্স!

raiserror()ঠিকঠাক কাজ করে তবে আপনার returnবিবৃতিটি ভুলে যাওয়া উচিত নয় অন্যথায় স্ক্রিপ্টটি ত্রুটি ছাড়াই চলতে থাকে! (হেনস রেইজারার কোনও "থ্রোয়ারর" নয় ;-)) এবং অবশ্যই প্রয়োজনে রোলব্যাক করা!

raiserror() স্ক্রিপ্টটি কার্যকর করে এমন ব্যক্তিকে বলতে ভাল লাগছে যে কিছু ভুল হয়েছে।


1

আপনি যদি ম্যানেজমেন্ট স্টুডিওতে কেবল কোনও স্ক্রিপ্ট সম্পাদন করে থাকেন এবং প্রথম ত্রুটিতে এক্সিকিউশন বা রোলব্যাক লেনদেন বন্ধ করতে চান (তবে যদি ব্যবহার করা হয়), তবে আমার বিবেচনার সবচেয়ে ভাল উপায় হ'ল ট্রাই ক্যাচ ব্লক (এসকিউএল 2005) এর পরে ব্যবহার করা। আপনি যদি কোনও স্ক্রিপ্ট ফাইল চালাচ্ছেন তবে ম্যানেজমেন্ট স্টুডিওতে এটি ভাল কাজ করে। সঞ্চিত প্রকল্প সর্বদা এটি ব্যবহার করতে পারে।


1
আপনার উত্তর 60+ upvotes সহ গৃহীত উত্তরে কী যুক্ত করে? আপনি কি এটি পড়েছেন? এই মেটাএসও প্রশ্নটি এবং জন স্কিটি দেখুন: কীভাবে একটি সঠিক উত্তর দিতে হয় সে সম্পর্কে ব্লগ কোডিং
ইয়ারোস্লাভ

0

যে দিনটিতে আমরা নিম্নলিখিতটি ব্যবহার করেছি ... সেরা কাজ করেছে:

RAISERROR ('Error! Connection dead', 20, 127) WITH LOG

0

এটিকে একটি ট্র্যাচ ক্যাচ ব্লকে আবদ্ধ করুন, তারপরে মৃত্যুদন্ড কার্যকর করার জন্য তা স্থানান্তরিত হবে।

BEGIN TRY
    PRINT 'This will be printed'
    RAISERROR ('Custom Exception', 16, 1);
    PRINT 'This will not be printed'
END TRY
BEGIN CATCH
    PRINT 'This will be printed 2nd'
END CATCH;
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.