SQL सर्वर - SQL स्क्रिप्ट के निष्पादन को रोकें या तोड़ें


325

क्या SQL सर्वर में SQL स्क्रिप्ट का निष्पादन तुरंत रोकने का एक तरीका है, जैसे "ब्रेक" या "एक्जिट" कमांड?

मेरे पास एक स्क्रिप्ट है जो आवेषण करने से पहले कुछ सत्यापन और लुकअप करती है, और मैं चाहता हूं कि यदि कोई मान्यता या लुकअप विफल हो जाए तो इसे रोक दें।

जवाबों:


371

RAISERROR विधि

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

यह कनेक्शन को समाप्त कर देगा, जिससे बाकी स्क्रिप्ट को चलने से रोक दिया जाएगा।

ध्यान दें कि WITH LOGइस तरह से काम करने के लिए गंभीरता स्तर 20 या उच्चतर और विकल्प दोनों आवश्यक हैं।

यह भी GO स्टेटमेंट के साथ काम करता है, जैसे।

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.

ध्यान दें कि 'हो' मुद्रित नहीं है।

चेतावनियां:

  • यह केवल तभी काम करता है जब आप व्यवस्थापक ('sysadmin') के रूप में लॉग इन होते हैं, और आपको बिना डेटाबेस कनेक्शन के भी छोड़ देता है।
  • यदि आप व्यवस्थापक के रूप में लॉग इन नहीं हैं, तो RAISEERROR () कॉल स्वयं विफल हो जाएगी और स्क्रिप्ट निष्पादित होती रहेगी
  • Sqlcmd.exe के साथ आह्वान करने पर, बाहर निकलें कोड 2745 की सूचना दी जाएगी।

संदर्भ: http : //www.mydat डेटाबेस upport.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
"यह कनेक्शन को समाप्त कर देगा" - ऐसा लगता है कि यह नहीं है, कम से कम यही तो मैं देख रहा हूं।
जकॉल्म

6
मैं इस विधि की कोशिश कर रहा था और जब मुझे एहसास हुआ कि सही परिणाम नहीं मिल रहा है ... किशमिश में केवल एक ही ई है ...
bobkingof12vs

187

बस एक RETURN का उपयोग करें (यह एक संग्रहीत प्रक्रिया के अंदर और बाहर दोनों काम करेगा)।


2
किसी कारण के लिए, मैं सोच रहा था कि वापसी स्क्रिप्ट में काम नहीं करती थी, लेकिन मैंने अभी इसकी कोशिश की, और यह करता है! साभार
एंडी व्हाइट

4
एक स्क्रिप्ट में, आप एक संग्रहीत प्रक्रिया में एक मान के साथ एक RETURN नहीं कर सकते हैं, लेकिन आप एक RETURN कर सकते हैं।
रॉब गैरीसन

53
नहीं यह केवल अगले GO तक समाप्त हो जाता है अगला बैच (GO के बाद) सामान्य रूप से चलेगा
मोर्टब

2
अगले गो के बाद यह जारी रहेगा।
जस्टिन

1
जीओ एक स्क्रिप्ट टर्मिनेटर या सीमांकक है; यह SQL कोड नहीं है। GO केवल उस क्लाइंट के लिए एक निर्देश है जिसे आप डेटाबेस इंजन में कमांड भेजने के लिए उपयोग कर रहे हैं जो कि जीओ परिसीमन के बाद एक नई स्क्रिप्ट शुरू कर रहा है।
उल्टा इंजीनियर

50

यदि आप SQLCMD मोड का उपयोग कर सकते हैं, तो झुकाव

: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.

और बैच बंद हो जाएगा। यदि SQLCMD मोड चालू नहीं है, तो आपको कोलन के बारे में पार्स त्रुटि मिलेगी। दुर्भाग्य से, यह पूरी तरह से बुलेटप्रूफ नहीं है जैसे कि एसक्यूएमएमडी मोड में होने के बिना स्क्रिप्ट को चलाया जाता है, एसक्यूएल मैनेजमेंट स्टूडियो सही अतीत की गलतियों को भी रोकता है! फिर भी, यदि आप उन्हें कमांड लाइन से चला रहे हैं, तो यह ठीक है।


4
शानदार टिप्पणी, धन्यवाद। मैं SSMS SQLCmd मोड में क्वेरी मेनू के अंतर्गत टॉगल करूँगा।
डेविड पीटर्स

यह उपयोगी है - इसका मतलब है कि दौड़ने के दौरान आपको -b विकल्प की आवश्यकता नहीं है
JonnyRaa

2
फिर भस्म ... लेकिन मैं कैसे जादू मिसाइल कास्ट करते हैं ?!
JJS

1
उत्तम। Sysadmin अल्ट्रा अतिरिक्त उपयोगकर्ता अधिकारों की आवश्यकता नहीं है
Pac0

21

मैं RAISERROR का उपयोग नहीं करूंगा- SQL में IF कथन हैं जिनका उपयोग इस उद्देश्य के लिए किया जा सकता है। अपना सत्यापन और लुकअप करें और स्थानीय चर सेट करें, फिर आवेषण को सशर्त बनाने के लिए IF स्टेटमेंट में चर के मान का उपयोग करें।

आपको हर सत्यापन परीक्षण के एक चर परिणाम की जांच करने की आवश्यकता नहीं होगी। आप आमतौर पर सभी शर्तों की पुष्टि करने के लिए केवल एक ध्वज चर के साथ ऐसा कर सकते हैं:

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

यहां तक ​​कि अगर आपका सत्यापन अधिक जटिल है, तो आपको अपने अंतिम चेक (ओं) को शामिल करने के लिए केवल कुछ ध्वज चर की आवश्यकता होनी चाहिए।


हाँ, मैं स्क्रिप्ट के अन्य भागों में IFs का उपयोग कर रहा हूं, लेकिन मैं सम्मिलित करने का प्रयास करने से पहले हर स्थानीय चर की जांच नहीं करना चाहता। मैं बल्कि पूरी स्क्रिप्ट को रोक देता हूं, और उपयोगकर्ता को इनपुट्स की जांच करने के लिए मजबूर करता हूं। (यह सिर्फ एक त्वरित और गंदी स्क्रिप्ट है)
एंडी व्हाइट

4
मुझे पूरा यकीन नहीं है कि यह उत्तर क्यों लिखा गया है क्योंकि यह तकनीकी रूप से सही है, बस यह नहीं कि पोस्टर "क्या" करना चाहता है।
जॉन सैंसोम

क्या शुरुआत के भीतर कई ब्लॉक होना संभव है..और? मीनिंग ऑफ STATEMENT; जाओ; बयान; जाओ; आदि आदि? मुझे त्रुटियाँ मिल रही हैं और मुझे लगता है कि इसका कारण हो सकता है।
नेनोटलेप

3
यह कहीं अधिक विश्वसनीय है RAISERROR, खासकर यदि आप नहीं जानते कि कौन स्क्रिप्ट चलाने जा रहा है और किन विशेषाधिकारों के साथ।
साइफर

@ जॉन संस: मैं यहां जो एकमात्र समस्या देख रहा हूं वह यह है कि यदि आप GO स्टेटमेंट पर ब्रांच करने का प्रयास कर रहे हैं तो IF स्टेटमेंट काम नहीं करता है। यह एक बड़ी समस्या है अगर आपकी स्क्रिप्ट GO स्टेटमेंट्स (जैसे DDL स्टेटमेंट्स) पर निर्भर करती है। यहाँ एक उदाहरण दिया गया है जो पहली बार बयान के बिना काम करता है :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

MSDN से:

एक अपवाद उठाता है और एक TRY के CATCH ब्लॉक में निष्पादन को स्थानांतरित करता है ... CATCH निर्माण ... यदि कोई TRY ... CATCH निर्माण उपलब्ध नहीं है, तो सत्र समाप्त हो गया है। लाइन नंबर और प्रक्रिया जहां अपवाद उठाया जाता है सेट किया जाता है। गंभीरता 16 पर सेट है।


1
THROW RAISERROR को बदलने के लिए है, लेकिन आप इसके साथ एक ही स्क्रिप्ट फ़ाइल में बाद के बैचों को नहीं रोक सकते।
NReilingh

@NReilingh को सही करें। यही वह जगह है जहां ब्लोर्बर्ग का जवाब वास्तव में एकमात्र समाधान है। हालांकि इसे गंभीरता से 20 के स्तर पर होना चाहिए, और अगर स्क्रिप्ट में कई बैच नहीं हैं, तो यह काफी भारी है।
जॉर्डन पार्कर

2
यदि आप वर्तमान ट्रांसकेशन को भी रद्द करना चाहते हैं तो xact abort सेट करें।
16:४२ पर नुरेटिन

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

जाहिर है कि कंपाइलर IF में @finished वैरिएबल को "समझता है", भले ही कोई त्रुटि थी और निष्पादन अक्षम था। हालाँकि, मान केवल 1 पर सेट है यदि निष्पादन अक्षम नहीं था। इसलिए मैं अपने अनुसार लेन-देन को अच्छी तरह से कमिट या रोलबैक कर सकता हूं।


मुझे समझ नहीं आता। मैंने निर्देशों का पालन किया। मैंने प्रत्येक GO के बाद निम्न SQL में प्रवेश किया। IF (XACT_STATE()) <> 1 BEGIN Set NOCOUNT OFF ;THROW 525600, 'Rolling back transaction.', 1 ROLLBACK TRANSACTION; set noexec on END; लेकिन निष्पादन कभी नहीं रुका, और मैं तीन "रोलिंग बैक ट्रांजेक्शन" त्रुटियों के साथ समाप्त हुआ। कोई विचार?
user1161391

12

आप अपने SQL स्टेटमेंट को WHILE लूप में लपेट सकते हैं और ज़रूरत पड़ने पर 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अधिक

यह है कि कुछ लोग गोटो प्रदर्शन करते हैं, लेकिन गोटो की तुलना में इसका पालन करना अधिक भ्रमित है।
nurettin

यह दृष्टिकोण एक अप्रत्याशित सामयिक GO से बचाता है। सराहना।

10

आप GOTO कथनों का उपयोग करके निष्पादन के प्रवाह को बदल सकते हैं :

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

/* our code */

EndScript:

2
गोटो का उपयोग अपवाद को संभालने का एक स्वीकार्य तरीका है। चर और घोंसले की मात्रा को कम करता है और डिस्कनेक्ट का कारण नहीं बनता है। यह शायद SQL सर्वर स्क्रिप्टिंग की अनुमति देता है कि पुरातन अपवाद से निपटने के लिए बेहतर है।
एंटोनियो ड्रूसिन

अन्य सभी सुझावों की तरह यहाँ भी, यह काम नहीं करता है यदि "हमारे कोड" में "GO" कथन है।
माइक गिल्डहिल

9

आगे की रिफाइनिंग ग्लास विधि, उपरोक्त पंक्तियाँ SQLCMD मोड का उपयोग करने के लिए बाध्य करती हैं, और यदि SQLCMD मोड का उपयोग नहीं किया जाता है या :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
यह एकमात्र तरीका है जिसे मैंने SSMS की चाटुकारिता के चारों ओर काम करने के लिए पाया है जो स्क्रिप्ट को निरस्त करने में असमर्थ है। लेकिन मैंने शुरुआत में 'SET NOEXEC OFF' जोड़ा, और अगर SQLCMD मोड में नहीं तो 'SET NOEXEC ON', अन्यथा वास्तविक स्क्रिप्ट तब तक चलती रहेगी जब तक कि आप लॉग के साथ 20 के स्तर पर त्रुटि नहीं उठाते।
मार्क सोउल

8

क्या यह एक संग्रहीत प्रक्रिया है? यदि हां, तो मुझे लगता है कि आप सिर्फ रिटर्न कर सकते हैं, जैसे कि "रिटर्न नाल";


उत्तर के लिए धन्यवाद, यह जानना अच्छा है, लेकिन इस मामले में यह एक संग्रहित खरीद नहीं है, बस एक स्क्रिप्ट फ़ाइल है
एंडी व्हाइट

1
@ गोर्डन हमेशा नहीं (यहां मैं खोज रहा हूं)। अन्य उत्तर देखें (एक बात के लिए इसे
ट्राई करें

6

मैं आपको सुझाव दूंगा कि आप अपने उपयुक्त कोड ब्लॉक को एक कोशिश कैच ब्लॉक में लपेटें। यदि आप चाहें तो कैच ब्लॉक को तोड़ने के लिए आप 11 की गंभीरता के साथ रायसेरर इवेंट का उपयोग कर सकते हैं। यदि आप अभी किशमिश करना चाहते हैं, लेकिन कोशिश ब्लॉक के भीतर निष्पादन जारी रखें तो कम गंभीरता का उपयोग करें।

सही बात?

चीयर्स, जॉन

[BOL संदर्भ शामिल करने के लिए संपादित]

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


मैंने एसक्यूएल में कभी भी एक कोशिश नहीं देखी है - क्या आप इसका एक त्वरित उदाहरण पोस्ट करना चाहेंगे?
एंडी व्हाइट

2
यह 2005 से नया है। BEGIN TRY {sql_statement | statement_block} END TRY BEGIN CATCH {sql_statement | statement_block} END CATCH [; ]
सैम

@Andy: संदर्भ जोड़ा गया, उदाहरण में शामिल है।
जॉन सैंसोम

2
TRY-CATCH ब्लॉक अपने अंदर जाने की अनुमति नहीं देता है।
एंटोनियो

4

आप RAISERROR का उपयोग कर सकते हैं ।


3
इससे मुझे कोई मतलब नहीं है- एक परिहार्य त्रुटि को उठाना (यह मानते हुए कि हम यहां प्रासंगिक सत्यापन के बारे में बात कर रहे हैं) यह एक भयानक तरीका है यदि आवेषण होने से पहले सत्यापन संभव है।
डेव स्वर्सकी

2
किशमिश को कम गंभीरता सेटिंग के साथ सूचनात्मक संदेश के रूप में उपयोग किया जा सकता है।
म्लादेन प्राजेडिक

2
स्क्रिप्ट तब तक जारी रहेगी जब तक कि स्वीकृत उत्तर में बताई गई कुछ शर्तें पूरी नहीं हो जातीं।
एरिक जे

4

इनमें से कोई भी 'गो' स्टेटमेंट के साथ काम नहीं करता है। इस कोड में, भले ही गंभीरता 10 या 11 हो, आपको अंतिम प्रिंट स्टेटमेंट मिलता है।

टेस्ट स्क्रिप्ट:

-- =================================
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 ...।)


क्रिएट प्रक्रिया के साथ ऐसा नहीं कर सकते हैं आदि एक समाधान के लिए मेरा जवाब देखें।
Blorgbeard

Blogbeard का समाधान बढ़िया है। मैं वर्षों से SQL सर्वर के साथ काम कर रहा हूं और यह पहली बार है जब मैंने यह देखा है।
रॉब गैरीसन

4

मैं RETURNयहां हर समय उपयोग करता हूं , स्क्रिप्ट में काम करता हूं याStored Procedure

सुनिश्चित करें कि ROLLBACKयदि आप एक में हैं तो लेन-देन करें , अन्यथा RETURNतुरंत एक खुले अन-लेनदेन के परिणामस्वरूप परिणाम होगा


5
एकाधिक बैच (GO कथन) युक्त स्क्रिप्ट के साथ काम नहीं करता है - ऐसा करने के लिए मेरा उत्तर देखें।
Blorgbeard

1
RETURN सिर्फ बयानों के वर्तमान ब्लॉक से बाहर निकलता है। यदि आप IF END ब्लॉक में हैं, तो END के बाद निष्पादन जारी रहेगा। इसका मतलब है कि आप कुछ शर्त के लिए परीक्षण के बाद निष्पादन समाप्त करने के लिए RETURN का उपयोग नहीं कर सकते, क्योंकि आप हमेशा IF END ब्लॉक में रहेंगे।
cdonner


3

आप GOTO स्टेटमेंट का उपयोग कर सकते हैं। इसे इस्तेमाल करे। यह आपके लिए पूर्ण उपयोग है।

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

FinalStatement:
     Select @CoumnName from TableName

GOTO को एक बुरा कोडिंग अभ्यास माना जाता है, "TRY..CATCH" के उपयोग की सिफारिश की जाती है, क्योंकि इसे SQL Server 2008 के बाद से पेश किया गया था, इसके बाद 2012 में THROW किया गया था।
एडी कुमार

1

जवाब के लिए thx!

raiserror()ठीक काम करता है लेकिन आपको returnकथन को नहीं भूलना चाहिए अन्यथा स्क्रिप्ट त्रुटि के बिना जारी रहती है! (अगरबत्ती एक "फेंकने वाला";;) नहीं है और यदि आवश्यक हो तो एक रोलबैक कर रहा है!

raiserror() उस व्यक्ति को बताना अच्छा है जो स्क्रिप्ट को निष्पादित करता है कि कुछ गलत हो गया।


1

यदि आप प्रबंधन स्टूडियो में केवल एक स्क्रिप्ट निष्पादित कर रहे हैं, और पहली त्रुटि पर निष्पादन या रोलबैक ट्रांजेक्शन (यदि उपयोग किया जाता है) को रोकना चाहते हैं, तो मेरा सबसे अच्छा तरीका है कि आप ट्रायल कैच ब्लॉक (SQL 2005 आगे) का उपयोग करें। यदि आप स्क्रिप्ट फ़ाइल निष्पादित कर रहे हैं तो यह प्रबंधन स्टूडियो में अच्छी तरह से काम करता है। संग्रहीत खरीद हमेशा इस के रूप में अच्छी तरह से उपयोग कर सकते हैं।


1
आपका उत्तर 60+ upvotes के साथ स्वीकृत उत्तर में क्या जोड़ता है? क्या तुमने यह पढ़ा? इस चेक metaSO सवाल और ब्लॉग कोडिंग: जॉन स्कीट कैसे एक सही जवाब देने के लिए पर।
यारोस्लाव

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;
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.