2008-11-20 10 views
183

मैं SQL सर्वर 2005 में एक बहुत लंबे समय से चल संग्रहीत प्रक्रिया है कि मैं डिबग करने के लिए कोशिश कर रहा हूँ, और मुझे 'प्रिंट' का उपयोग कर रहा यह करने के लिए आदेश। समस्या यह है, मैं सिर्फ अपने sproc के अंत में एसक्यूएल सर्वर से वापस संदेश मिल रहा है - मैं संदेश बफर फ्लश और इन संदेशों को sproc के रनटाइम के दौरान तुरंत देखने के लिए, बजाय बहुत से सक्षम होने के लिए करना चाहते हैं समाप्त।मैं टीएसक्यूएल में प्रिंटर बफर कैसे फ्लश कर सकता हूं?

RAISERROR('This message will show up right away...',0,1) WITH NOWAIT 

आप पूरी तरह RAISERROR के साथ अपने सभी प्रिंट नहीं बदलना चाहिए:

उत्तर

260

RAISERROR समारोह का उपयोग करें। यदि आपके पास लूप या बड़ा कर्सर कहीं है तो इसे प्रति बार एक या दो बार या फिर हर कई पुनरावृत्तियों को भी करें।

इसके अलावा: मैं पहली बार RAISERROR के बारे में इस लिंक है, जो मैं अब और SQL सर्वर त्रुटि निवारण पर निश्चित स्रोत पर विचार निश्चित रूप से लायक पढ़ने पर पता चला:
http://www.sommarskog.se/error-handling-I.html

+33

ध्यान दें कि एसक्यूएल में TRY/CATCH केवल गंभीरता के साथ त्रुटियों को पकड़ लेगा> 10, इसलिए इस तरह से RAISERROR का उपयोग करके आपके कैच स्टेटमेंट में कूद नहीं होगा। जो बहुत अच्छा है, इसका मतलब है कि आप अभी भी ट्रे/कैच के साथ इस तरह के रेज़रर का उपयोग कर सकते हैं। रेफरी: http://msdn.microsoft.com/en-us/library/ms175976.aspx – Rory

+8

ध्यान दें कि यह पहले 500 संदेशों के बाद काम नहीं करता है; एक बार जब आप उससे अधिक प्रिंट करते हैं तो अचानक अचानक बफरिंग शुरू हो जाती है! – GendoIkari

+0

@GendoIkari मुझे एक ही समस्या है। क्या आपने इसे हल किया? –

15

हाँ ... RAISERROR के पहले पैरामीटर फ़ंक्शन को NVARCHAR चर की आवश्यकता होती है। तो निम्नलिखित कोशिश करें;

-- Replace PRINT function 
DECLARE @strMsg NVARCHAR(100) 
SELECT @strMsg = 'Here''s your message...' 
RAISERROR (@strMsg, 0, 1) WITH NOWAIT 

या

RAISERROR (n'Here''s your message...', 0, 1) WITH NOWAIT 
+9

परिणाम टैब के बगल में, नीचे दिए गए संदेश टैब को देखें या टेक्स्ट मोड में परिणाम पर स्विच करें। –

+0

एसएसएमएस में, पाठ मोड में परिणामों को स्विच करने के लिए, मेनू टूल्स -> विकल्प -> क्वेरी परिणाम -> SQL सर्वर -> सामान्य -> ​​परिणामों के लिए डिफ़ॉल्ट गंतव्य, और "ग्रिड के परिणाम" के बजाय "टेक्स्ट के परिणाम" चुनें, क्वेरी विंडो को फिर से खोलें और फिर आप वहां एक डमी जैसे रिक्त परिणाम टैब को देखकर वहां नहीं बैठेंगे जबकि RAISERROR आउटपुट संदेश टैब पर जाता है। – Adam

3
बस संदर्भ के लिए

, यदि आप स्क्रिप्ट (बैच प्रोसेसिंग), संग्रहीत प्रक्रिया में नहीं में काम करते हैं, निस्तब्धता उत्पादन GO आदेश है, उदा शुरू हो रहा है

print 'test' 
print 'test' 
go 

सामान्य तौर पर, मेरे निष्कर्ष यह है निम्नलिखित: mssql स्क्रिप्ट निष्पादन के उत्पादन, एसएमएस जीयूआई में या sqlcmd.exe साथ क्रियान्वित करने, पहले GO बयान पर या के अंत तक दाखिल करने के लिए, stdoutput, जीयूआई खिड़की प्लावित है स्क्रिप्ट।

संग्रहीत प्रक्रिया कार्यों के अंदर अलग ढंग से फ्लशिंग, के बाद से आप स्थान के अंदर नहीं जा सकते।

संदर्भ: tsql Go statement

+0

'go' सिर्फ आउटपुट फ्लश नहीं करता है, यह आपके द्वारा प्रदान किए गए लिंक के अनुसार बैच को समाप्त करता है। जो कुछ भी आप 'घोषित करते हैं' को त्याग दिया जाता है, इसलिए डीबगिंग के लिए बहुत उपयोगी नहीं है। @test int प्रिंट घोषित करें "मैं इसे पढ़ना चाहता हूं!" सेट @ test = 5' पर जाएं, हालांकि आप '@ test' का दावा करने में त्रुटि अपरिभाषित है क्योंकि यह एक नए बैच में है। – funkwurm

+1

मैं मानता हूं, यह इस प्रश्न का उचित उत्तर नहीं है, लेकिन मैंने जवाब दिया (शुरुआत में अस्वीकरण देखें) क्योंकि यह किसी और के लिए उपयोगी हो सकता है - उदा। बैच एसक्यूएल चलाने वाला कोई भी व्यक्ति। –

9

एक और बेहतर विकल्प प्रिंट या RAISERROR पर निर्भर नहीं करने के लिए और बस tempdb में एक ## अस्थायी तालिका या अपने डेटाबेस में एक स्थायी तालिका जो आप दृश्यता दे देंगे में अपने "प्रिंट" बयान लोड है किसी अन्य विंडो से एक चयन कथन के माध्यम से तुरंत डेटा के लिए। यह मेरे लिए सबसे अच्छा काम करता है। एक स्थायी तालिका का उपयोग करना, अतीत में जो हुआ उससे लॉग के रूप में कार्य करता है। प्रिंट स्टेटमेंट त्रुटियों के लिए आसान हैं, लेकिन लॉग टेबल का उपयोग करके आप उस विशेष निष्पादन के लिए अंतिम लॉग मूल्य के आधार पर विफलता का सटीक बिंदु भी निर्धारित कर सकते हैं (मान लें कि आप अपनी लॉग तालिका में समग्र निष्पादन प्रारंभ समय ट्रैक करते हैं।)

+1

यदि आप प्रतिबद्ध और रोलबैक के साथ वास्तव में लेनदेन लिपि लिख रहे हैं तो यह एक मुद्दा हो सकता है। मुझे विश्वास नहीं है कि आप अपनी अस्थायी तालिका को लाइव करने में सक्षम होंगे - और यदि आपका लेनदेन विफल रहता है तो यह दूर हो जाएगा। – SteveJ

+0

@SteveJ आप अपने निगरानी सत्र – TheConstructor

+0

@TheConstructor में 'सेट ट्रांज़ेक्शन इज़ोलेशन स्तर पढ़ा गया' का उपयोग कर लाइव से पूछ सकते हैं; यह एक सहायक युक्ति है - मैं इसका उपयोग करूंगा, धन्यवाद। हालांकि, क्या हम अभी भी रोलबैक पर जाने वाली अस्थायी तालिका के साथ नहीं गए हैं? अगर विफलता विश्लेषण कर रहा है, ऐसा लगता है कि यह एक बड़ी कमी होगी। – SteveJ

3
@JoelCoehoorn द्वारा उत्तर पर

भवन, मेरी दृष्टिकोण ही स्थान में सभी मेरी प्रिंट बयान छोड़ देते हैं, और बस उन्हें RAISERROR बयान के साथ पालन फ्लश पैदा करने के लिए है।

उदाहरण के लिए:

PRINT 'MyVariableName: ' + @MyVariableName 
RAISERROR(N'', 0, 1) WITH NOWAIT 

इस दृष्टिकोण का लाभ यह है कि प्रिंट बयान तार जोड़ सकते हैं, जबकि RAISERROR नहीं कर सकता है। (तो या तो आपके पास कोड की लाइनों की एक ही संख्या है, क्योंकि आपको घोषित करना होगा और RAISERROR में उपयोग करने के लिए एक चर सेट करना होगा)।

, तो मेरे जैसे, आप AutoHotkey या SSMSBoost या एक बराबर उपकरण का उपयोग, आप आसानी से ऊपर एक शॉर्टकट इस तरह के "] फ्लश" आप के लिए RAISERROR लाइन प्रवेश करने के लिए के रूप में सेट कर सकते हैं।यह आपको समय बचाता है अगर यह हर बार कोड की एक ही पंक्ति है, यानी विशिष्ट पाठ या चर रखने के लिए अनुकूलित करने की आवश्यकता नहीं है।