22

मैं अभी बनाया की वाक्य रचना अर्थ है एक के बजाय बाद उत्प्रेरक जिसका वाक्य रचना नीचे दिया गया हैक्या RAISERROR()

Create trigger tgrInsteadTrigger on copytableto 
Instead of Insert as 
    Declare @store_name varchar(30); 
    declare @sales int; 
    declare @date datetime; 

    select @store_name = i.store_name from inserted i 
    select @sales = i.sales from inserted i 
    select @date = i.Date from inserted i 
begin 
    if (@sales > 1000) 
     begin 
     RAISERROR('Cannot Insert where salary > 1000',16,1); ROLLBACK; 
     end 
    else 
     begin 
     insert into copytablefrom(store_name, sales, date) values (@store_name, @sales, @date); 
     Print 'Instead After Trigger Executed'; 
     end 
End 

ऊपर वाक्य रचना मैं RAISERROR('Cannot Insert where salary > 1000',16,1)

का इस्तेमाल किया है में लेकिन यह RAISERROR('Cannot Insert where salary > 1000') जब मैं लिखने एक ही पंक्ति पर "गलत वाक्यविन्यास" के पास त्रुटि देता है।

क्या कोई यहां (16,1) के उपयोग की व्याख्या कर सकता है।

+0

'रायसइरर' का वाक्यविन्यास समझाया गया है [यहां] (http://msdn.microsoft.com/en-us/library/ms178592 (v = sql.100) .aspx)। – HABO

+3

यह ट्रिगर टूटा हुआ है - यह मानता है कि 'डालने' में एक * एकल * पंक्ति है, जबकि वास्तव में 'डाला' में 0, 1, या * कई * पंक्तियां हो सकती हैं। –

उत्तर

37

यह त्रुटि का गंभीरता स्तर है। स्तर 11 से 20 हैं जो एसक्यूएल में एक त्रुटि फेंक देते हैं। स्तर जितना अधिक होगा, उतना ही गंभीर स्तर और लेनदेन को निरस्त किया जाना चाहिए।

आप सिंटेक्स त्रुटि मिल जाएगा जब आप कार्य करें:

RAISERROR('Cannot Insert where salary > 1000'). 

क्योंकि आप निर्दिष्ट नहीं किया है सही मानकों (गंभीरता स्तर या राज्य)।

आप एक चेतावनी और नहीं एक अपवाद है, उपयोग स्तरों 0 जारी करने के लिए चाहते हैं - 10

MSDN से:

गंभीरता

उपयोगकर्ता परिभाषित गंभीरता इस के साथ जुड़े स्तर है संदेश। sp_addmessage का उपयोग करके बनाए गए उपयोगकर्ता द्वारा परिभाषित संदेश को बढ़ाने के लिए msg_id का उपयोग करते हुए, RAISERROR पर निर्दिष्ट गंभीरता sp12addmessage में निर्दिष्ट गंभीरता को ओवरराइड करता है। 0 से 18 से गंभीरता स्तर किसी भी उपयोगकर्ता द्वारा निर्दिष्ट किया जा सकता है। 1 9 से 25 तक गंभीरता स्तर केवल सिटरडम निश्चित सर्वर भूमिका या उपयोगकर्ताओं द्वारा ALTER TRACE अनुमतियों के सदस्यों द्वारा निर्दिष्ट किया जा सकता है। गंभीरता के स्तर के लिए 1 9 से 25 के माध्यम से, LO LO विकल्प के साथ आवश्यक है।

राज्य

0 255. के माध्यम से नकारात्मक मूल्यों से एक पूर्णांक है या बड़ा 255 से कोई त्रुटि उत्पन्न महत्व देता है। यदि एक ही उपयोगकर्ता द्वारा परिभाषित त्रुटि एकाधिक स्थानों पर उठाई गई है, तो प्रत्येक स्थान के लिए एक अद्वितीय स्थिति संख्या का उपयोग करके पता लगाने में सहायता मिल सकती है कि कोड का कौन सा अनुभाग त्रुटियों को उठा रहा है।

http://support.microsoft.com/kb/321903

+0

धन्यवाद, आपका उत्तर मेरी अवधारणा को साफ़ करता है, लेकिन क्या आप राज्य के पीछे अवधारणा को समझा सकते हैं, RAISERROR() का तीसरा पैरामीटर। – user2289490

+2

@ user2289490 - इसका उपयोग यह निर्धारित करने के लिए किया जा सकता है कि त्रुटि कहां डाली गई थी। अर्थात। यदि आप राज्य 1 के साथ कोई त्रुटि उठाते हैं और फिर एक और त्रुटि (आपकी संग्रहीत प्रक्रिया के एक अलग हिस्से में) आप पता लगा सकते हैं कि आपकी प्रक्रिया के किस हिस्से ने अपवाद फेंक दिया है। –

8
MSDN

RAISERROR ({ msg_id | msg_str | @local_variable } 
    { ,severity ,state } 
    [ ,argument [ ,...n ] ]) 
    [ WITH option [ ,...n ] ] 

16 के अनुसार

गंभीरता होगा।
1 राज्य होगा।

आपको जो त्रुटि मिलती है वह इसलिए है क्योंकि आपने RAISEERROR फ़ंक्शन के लिए आवश्यक पैरामीटर की उचित आपूर्ति नहीं की है।

11

16 गंभीरता और 1 राज्य, और अधिक विशेष निम्न उदाहरण आप वाक्य रचना और उपयोग के बारे में और अधिक विस्तार दे सकता है है:

BEGIN TRY 
    -- RAISERROR with severity 11-19 will cause execution to 
    -- jump to the CATCH block. 
    RAISERROR ('Error raised in TRY block.', -- Message text. 
       16, -- Severity. 
       1 -- State. 
       ); 
END TRY 
BEGIN CATCH 
    DECLARE @ErrorMessage NVARCHAR(4000); 
    DECLARE @ErrorSeverity INT; 
    DECLARE @ErrorState INT; 

    SELECT 
     @ErrorMessage = ERROR_MESSAGE(), 
     @ErrorSeverity = ERROR_SEVERITY(), 
     @ErrorState = ERROR_STATE(); 

    -- Use RAISERROR inside the CATCH block to return error 
    -- information about the original error that caused 
    -- execution to jump to the CATCH block. 
    RAISERROR (@ErrorMessage, -- Message text. 
       @ErrorSeverity, -- Severity. 
       @ErrorState -- State. 
       ); 
END CATCH; 

आप का पालन करें और से http://msdn.microsoft.com/en-us/library/ms178592.aspx

3

गंभीरता स्तर अधिक उदाहरण की कोशिश कर सकते 16 आपके उदाहरण कोड में आमतौर पर उपयोगकर्ता द्वारा परिभाषित (उपयोगकर्ता-पता) त्रुटियों के लिए उपयोग किया जाता है। एसक्यूएल सर्वर डीबीएमएस स्वयं severity levels (और त्रुटि संदेश) को उन समस्याओं के लिए उत्सर्जित करता है, जो अधिक गंभीर (उच्च संख्या) और कम (कम संख्या) दोनों होते हैं।

राज्य 0 और 255 के बीच एक पूर्णांक होना चाहिए (नकारात्मक मान एक त्रुटि देंगे), लेकिन पसंद मूल रूप से प्रोग्रामर है। विभिन्न राज्य मानों को रखना उपयोगी होता है यदि उपयोगकर्ता द्वारा परिभाषित त्रुटि के लिए एक ही त्रुटि संदेश अलग-अलग स्थानों में उठाया जाएगा, उदा। यदि त्रुटियों के डीबगिंग/समस्या निवारण की सहायता से त्रुटि का पता चलने के अतिरिक्त संकेत दिए जाएंगे।