2013-03-14 6 views
21

मैं SQL सर्वर प्रबंधन स्टूडियो 2008 में संग्रहित प्रक्रियाओं को डीबग करने का प्रयास कर रहा हूं। मैं कुछ आईएफ-स्टेटमेंट्स का परीक्षण करने के लिए कुछ प्रिंट स्टेटमेंट्स डालना चाहता हूं जो मुझे पता है कि गलत हैं।प्रिंट स्टेटमेंट के साथ संग्रहीत प्रक्रियाओं को डीबग कैसे करें?

डीबगिंग करने के लिए, मैंने PRINT '5' कमांड का उपयोग करने का प्रयास किया।

मैंने RAISERROR'RAISERROR (N'Start',10,1) WITH NOWAIT' जैसे उपयोग करने का प्रयास किया।

लेकिन इन्हें कोई प्रिंटआउट नहीं दिखाया गया, केवल परिणाम सेट। संदेश सिर्फ 1 row affected कहता है।

SET NOCOUNT ON   
RAISERROR (N'Start',10,1) WITH NOWAIT  
DECLARE @DocHandle INT   
DECLARE @PageSize INT, @PageIndex INT, @TOTL_CONT NUMERIC(5,0), @Paging BIT   
DECLARE @Type INT, @Search varchar(20) , @ORDE nVARCHAR(50), @SORT_ID nVARCHAR(50) 
DECLARE @CreatedOn varchar(25), @SystemGenerate bit 

सबसे अच्छा तरीका है एक संग्रहीत प्रक्रिया डिबग करने के लिए प्रिंट बयान का उपयोग करने के क्या है:

मैं बहुत की तरह कोड लिखने के लिए (शायद यह एक गलत दृष्टिकोण है) का प्रयास किया?

+1

आप हमें अगर बयान दिखा सकते हैं? अगर यह मुद्रित नहीं होता है, तो संभवतः परीक्षण विफल हो गया और यह सशर्त ब्लॉक में प्रवेश नहीं किया। – Bridge

+0

जब आप अपनी संग्रहीत प्रक्रिया को अपडेट करते हैं, या जब आप इसे वास्तव में निष्पादित करते हैं तो '1 पंक्ति प्रभावित' होती है? ऐसा कोई कारण नहीं है कि आपके द्वारा दिए गए कोड ने कुछ मुद्रित नहीं किया होगा (संदेश विंडो में, परिणामों के लिए नहीं)। जैसा कि बताया गया है, –

उत्तर

17

यदि आप MSSQL सर्वर प्रबंधन स्टूडियो प्रिंट स्टेटमेंट का उपयोग कर रहे हैं तो संदेश टैब के अंतर्गत परिणाम टैब के अंतर्गत प्रिंट नहीं किया जाएगा।

enter image description here

प्रिंट बयान वहां दिखाई देंगे।

+2

मिमी, केवल एक चीज जिसे मैं वहां देखता हूं वह '1 पंक्ति प्रभावित' है। –

+2

क्या आपने प्रिंट प्रिंट को प्रक्रिया के पहले पंक्ति के रूप में देखने का प्रयास किया है, यह देखने के लिए कि क्या यह प्रिंट करता है। यह हो सकता है कि अगर आपके जैसे उम्मीदों में प्रवेश नहीं किया जा रहा है। –

+0

मैं पुष्टि कर सकता हूं कि वर्तमान SQL सर्वर प्रबंधन स्टूडियो उन संदेशों को नहीं दिखाता है (सर्वर अमेज़ॅन के क्लाउड पर चलता है)। –

10

उपयोग करके देखें:

RAISERROR('your message here!!!',0,1) WITH NOWAIT 

आप भी "पाठ परिणाम" यह डिफ़ॉल्ट उपकरण पट्टी पर "निष्पादित" के बगल में बस कुछ ही माउस है स्विचन की कोशिश कर सकते।

उपर्युक्त दोनों जगहों के साथ, और आप अभी भी संदेशों को नहीं देखते हैं, तो सुनिश्चित करें कि आप जिस प्रक्रिया को संपादित कर रहे हैं उसका उसी सर्वर/डेटाबेस/मालिक संस्करण चला रहे हैं। सुनिश्चित करें कि आप RAISERROR कमांड को मार रहे हैं, इसे प्रक्रिया के अंदर पहला आदेश दें।

तो बाकी सब विफल रहता है, आप एक तालिका बना सकते हैं:

create table temp_log (RowID int identity(1,1) primary key not null 
         , MessageValue varchar(255)) 

तो:

INSERT INTO temp_log VALUES ('Your message here') 

तो (कोई पुनरावर्तन प्रदान की) प्रक्रिया सिर्फ select तालिका चलाने के बाद।

7

यहां प्रिंट स्टेटमेंट उपयोग का एक उदाहरण दिया गया है। उन्हें संदेश टैब के तहत पिछले व्यक्ति के रूप में दिखाई देना चाहिए।

Declare @TestVar int = 5; 

    print 'this is a test message'; 
    print @TestVar; 
    print 'test-' + Convert(varchar(50), @TestVar); 

Print Messages

8

इससे पहले कि मैं अपने को दोहराया जवाब देने के लिए मिलता है, मैं कबूल कर रहा हूं कि एकमात्र उत्तर मैं यहां स्वीकार करूंगा one ऊपर KM. द्वारा। मैंने अन्य उत्तरों को वोट दिया क्योंकि उनमें से कोई भी वास्तव में पूछे गए प्रश्न का उत्तर नहीं दिया था या वे पर्याप्त नहीं थे। प्रिंट आउटपुट वास्तव में संदेश विंडो में दिखाई देता है, लेकिन यह बिल्कुल नहीं पूछा गया था।

प्रिंटर स्टेटमेंट निष्पादन के दौरान प्रिंटर स्टेटमेंट आउटपुट क्यों नहीं दिखाता है?
इस उत्तर का संक्षिप्त संस्करण यह है कि आप अपने स्पोक के निष्पादन को SQL सर्वर पर भेज रहे हैं और यह पूरे लेनदेन के साथ समाप्त होने तक प्रतिक्रिया देने वाला नहीं है। इस external link पर स्थित एक बेहतर उत्तर यहां दिया गया है।

  • भी अधिक राय/टिप्पणियों के लिए यह इतना पोस्ट here पर अपना ध्यान केन्द्रित।
  • विशेष रूप Phil_factor द्वारा एक ही पोस्ट के इस answer को देखो (हा हा! प्यार एसक्यूएल हास्य) JimCarden

द्वारा एक ही पोस्ट के इस answer पर प्रतीक्षा नहीं देखो के साथ RAISERROR का उपयोग करने का सुझाव के बारे में

  • इन बातों

    1. कुछ लोगों को धारणा के तहत कर रहे हैं कि वे सिर्फ अपने प्रिंट बयान के बाद एक GO कथन का उपयोग कर सकते हैं मत करो, लेकिन आप एक स्पोक के अंदर जाओ कथन का उपयोग नहीं कर सकते हैं। तो समाधान बाहर है।
    2. मैं आपके प्रिंट स्टेटमेंट्स को चुनने की अनुशंसा नहीं करता क्योंकि यह सिर्फ आपके परिणाम सेट बकवास के साथ गड़बड़ कर रहा है और यदि आपके स्पोक को बाद में किसी प्रोग्राम द्वारा उपभोग किया जाना है, तो आपको यह जानना होगा कि कौन सा परिणाम सेट है अपने डेटा रीडर से परिणामों के माध्यम से लूपिंग जब छोड़ें। यह सिर्फ एक बुरा विचार है, इसलिए ऐसा मत करो।
    3. SELECT-ING के साथ एक और समस्या आपके प्रिंट स्टेटमेंट्स यह है कि वे हमेशा तुरंत दिखाई नहीं देते हैं। मेरे पास विभिन्न निष्पादन के लिए इसके साथ अलग-अलग अनुभव हुए हैं, इसलिए इस पद्धति के साथ किसी भी प्रकार की स्थिरता की अपेक्षा न करें।

    वैकल्पिक एक संग्रहीत प्रक्रिया
    के अंदर मुद्रित करने के लिए वास्तव में यह मेरी राय में चारों ओर एक भावुक जिस तरह का काम है, क्योंकि वाक्य रचना है कि यह प्रयोग किया जा रहा है के संदर्भ में भ्रामक है, लेकिन जो इसे शायद जानता है माइक्रोसॉफ्ट द्वारा भविष्य में अद्यतन किया जाएगा। मुझे डीबग जानकारी प्रिंट करने के एकमात्र उद्देश्य के लिए त्रुटि उठाने का विचार पसंद नहीं है ...

    ऐसा लगता है कि इस मुद्दे के आसपास एकमात्र तरीका उपयोग करना है, जैसा कि कई बार पहले से ही रिज़रर समझाया गया है इंतज़ार नही। मैं एक उदाहरण प्रदान करने और इस दृष्टिकोण के साथ एक छोटी सी समस्या की ओर इशारा कर रहा हूँ:

    ALTER 
    --CREATE 
        PROCEDURE [dbo].[PrintVsRaiseErrorSprocExample] 
    AS 
    BEGIN 
        SET NOCOUNT ON; 
    
        -- This will print immediately 
        RAISERROR ('RE Start', 0, 1) WITH NOWAIT 
        SELECT 1; 
    
        -- Five second delay to simulate lengthy execution 
        WAITFOR DELAY '00:00:05' 
    
        -- This will print after the five second delay 
        RAISERROR ('RE End', 0, 1) WITH NOWAIT 
        SELECT 2; 
    END 
    
    GO 
    
    EXEC [dbo].[PrintVsRaiseErrorSprocExample] 
    

    SELECT कथन परिणाम दोनों ही दिखाएगा के बाद निष्पादन समाप्त हो गया है और प्रिंट ऊपर दिए गए कथन दिखाए गए क्रम में दिखाई देंगे। इस दृष्टिकोण के साथ

    संभावित समस्या
    मान लीजिए कि आप एक के बाद दोनों अपने प्रिंट बयान और RAISERROR बयान एक करते हैं, तो वे दोनों प्रिंट। मुझे यकीन है कि इसमें बफरिंग के साथ कुछ करना है, लेकिन बस जागरूक रहें कि यह हो सकता है।

    ALTER 
    --CREATE 
        PROCEDURE [dbo].[PrintVsRaiseErrorSprocExample2] 
    AS 
    BEGIN 
        SET NOCOUNT ON; 
    
        -- Both the PRINT and RAISERROR statements will show 
        PRINT 'P Start'; 
        RAISERROR ('RE Start', 0, 1) WITH NOWAIT 
        SELECT 1; 
    
        WAITFOR DELAY '00:00:05' 
    
        -- Both the PRINT and RAISERROR statements will show 
        PRINT 'P End' 
        RAISERROR ('RE End', 0, 1) WITH NOWAIT 
        SELECT 2; 
    END 
    
    GO 
    
    EXEC [dbo].[PrintVsRaiseErrorSprocExample2] 
    

    इसलिए यहां के आसपास का काम है, प्रिंट और रिज़रर दोनों का उपयोग न करें, बस एक दूसरे को चुनें। यदि आप अपने आउटपुट को स्पोक के निष्पादन के दौरान दिखाना चाहते हैं तो फिर नाउएट के साथ रेज़रर का उपयोग करें।MSDN प्रलेखन में इस Howto पर

  • +1

    बाहरी लिंक पर फंसे नहीं हैं। एक ऐसा जवाब जो पूरी तरह से बाहरी लिंक पर निर्भर करता है और उसके पास कोई पदार्थ नहीं है। यदि आप लोगों के लिए अतिरिक्त विवरण प्राप्त करने के लिए बाहरी लिंक प्रदान करते हैं, तो यह वास्तव में एक अच्छी बात है। – mason

    +0

    मैं आपको सुनता हूं और इस तरह मैंने ऐतिहासिक रूप से उनका उपयोग किया है, केवल एक लिंक का उपयोग करने की आलोचना या आलोचना करने के लिए। तर्क आमतौर पर "लिंक मृत हो सकता है" जिसके साथ मैं आमतौर पर जवाब देता हूं "मैं किसी और के काम को चोरी करने वाला नहीं हूं।" जिसे मैंने अन्य लोगों को देखा है क्योंकि वे अंक के लिए शिकार कर रहे हैं। मुझे बस उन टिप्पणियों को पसंद नहीं है, इसलिए मैं इस बार इसके बारे में पूर्ववत था। – dyslexicanaboko

    +1

    यदि आप बाहरी लिंक का उपयोग करते हैं और उत्तर के शरीर में स्वयं को शिकायत करने के लिए पर्याप्त जानकारी नहीं है तो आप केवल शिकायत करेंगे। अगर आपके पास अपने प्रश्न में पर्याप्त जानकारी है, और केवल पूरक के रूप में बाहरी लिंक का उपयोग करें, तो आप ठीक होंगे। और यदि कोई शिकायत करता है, तो बस उन्हें बताएं कि मैंने आपको क्या बताया है और इसके बारे में चिंता न करें। बाहरी लिंक को शामिल करने के लिए आपके उत्तर में माफी माँगने की कोई आवश्यकता नहीं है। – mason

    -1

    देखो: Run the Transact-SQL Debugger - यह नहीं प्रिंट बयान के साथ है, लेकिन शायद यह तुम वैसे भी अपने कोड डिबग करने के लिए मदद करता है।

    यह यूट्यूब वीडियो: SQL Server 2008 T-SQL Debugger डीबगर का उपयोग दिखाता है।

    => संग्रहीत प्रक्रिया Transact-SQL में लिखी गई हैं। यह आपको सभी ट्रांजैक्ट-एसक्यूएल कोड डीबग करने की अनुमति देता है और इसलिए यह विजुअल स्टूडियो में ब्रेकपॉइंट्स को परिभाषित करने और चर देखने के साथ डिबगिंग की तरह है।

    संबंधित मुद्दे