मैं त्रुटि संदेश से वास्तविक संग्रहीत कार्यविधि लाइन नंबर कैसे प्राप्त कर सकता हूं?


110

जब मैं SQL सर्वर का उपयोग करता हूं और कोई त्रुटि होती है, तो त्रुटि संदेश एक पंक्ति संख्या देता है जिसका संग्रहीत कार्यविधि में पंक्ति संख्या से कोई संबंध नहीं है। मैं मानता हूं कि अंतर सफेद स्थान और टिप्पणियों के कारण है, लेकिन क्या यह वास्तव में है?

मैं लाइन नंबर के इन दो सेटों को एक दूसरे से कैसे संबंधित कर सकता हूं? अगर कोई मुझे सही दिशा में कम से कम एक पॉइंटर दे सकता है, तो मैं वास्तव में इसकी सराहना करूंगा।

मैं SQL सर्वर 2005 का उपयोग कर रहा हूँ।


1
मुझे लगता है कि लाइन नंबर खरीद के शरीर से संबंधित है। यानी हेडर को नजरअंदाज करें।
मार्टिन स्मिथ


हेडर कहाँ समाप्त होता है? शुरुआत के बाद जो परिवर्तन प्रक्रिया का अनुसरण करता है ... एएस?
चम्मा

ऐसा लग रहा create procथा कि मेरे टेस्ट में लाइन से गिनती शुरू होगी । मुझे लगता है कि आप कुछ अलग देख रहे हैं।
मार्टिन स्मिथ

1
मेरे जवाब में यहाँ बताया गया है: stackoverflow.com/questions/2947173/…
gbn

जवाबों:


113

IIRC, यह उस खरीद को बनाने वाले बैच की शुरुआत से लाइनों की गिनती शुरू करता है। इसका मतलब है कि या तो स्क्रिप्ट की शुरुआत, या फिर खरीद / परिवर्तन कथन से पहले अंतिम "जीओ" बयान।

यह देखने का एक आसान तरीका है कि ऑब्जेक्ट बनाते समय SQL सर्वर द्वारा उपयोग किए गए वास्तविक पाठ को खींचना है। अपने आउटपुट को टेक्स्ट मोड पर स्विच करें (डिफ़ॉल्ट कुंजी मैपिंग के साथ CTRL-T) और चलाएं

sp_helptext proc_name

सिंटैक्स हाइलाइटिंग आदि प्राप्त करने के लिए एक स्क्रिप्ट विंडो में परिणामों को कॉपी करें और रिपोर्ट की गई त्रुटि लाइन पर जाने के लिए गोटो लाइन फ़ंक्शन (CTRL-G I think) का उपयोग करें।


14
जब मैंने इसे ग्रिड-आउटपुट मोड में किया, तो इसने लाइन नंबरों को भी
चिपका दिया

2
@codeulike - अच्छा बिंदु, यदि आप ग्रिड आउटपुट का उपयोग करते हैं तो पंक्ति संख्या पंक्ति संख्या से मेल खाएगी, इसलिए आपको CTRL / G का उपयोग करने की आवश्यकता नहीं है। ग्रिड आउटपुट के साथ मेरा एकमात्र मुद्दा यह है कि यह TAB वर्णों को एक ही स्थान पर बदलता है, इसलिए आप सभी स्वरूपण खो देते हैं।
रिक

32

आदत से बाहर मैं LINENO 0सीधे BEGINमेरे संग्रहीत प्रक्रियाओं के बाद जगह है । यह इस मामले में लाइन नंबर - शून्य पर रीसेट करता है। फिर SSMS में पंक्ति संख्या में त्रुटि संदेश द्वारा बताई गई पंक्ति संख्या जोड़ें, जहां आपने लिखा था LINENO 0और बिंगो - आपके पास त्रुटि की पंक्ति संख्या है जैसा कि क्वेरी विंडो में दर्शाया गया है।


4
सिर्फ "लाइननॉ एक्स" को क्यों नहीं रखा जाए जहां एक्स = लाइन नंबर को आपने स्टेटमेंट पर रखा है, ताकि यह स्वचालित रूप से रिपोर्ट किए गए लाइन नंबर में जुड़ जाए?
लैरीबड

8

यदि आप कैच ब्लॉक का उपयोग करते हैं और कोशिश ब्लॉक के भीतर किसी भी कोड सत्यापन के लिए एक RAISERROR () का उपयोग करते हैं तो त्रुटि रेखा को सूचित किया जाता है कि कैच ब्लॉक कहां है और वास्तविक त्रुटि कहां हुई है। मैंने इसे साफ करने के लिए इसका इस्तेमाल किया।

BEGIN CATCH
  DECLARE @ErrorMessage NVARCHAR(4000);
  DECLARE @ErrorSeverity INT;
  DECLARE @ErrorState INT;

  SELECT 
     @ErrorMessage = ERROR_MESSAGE() + ' occurred at Line_Number: ' + CAST(ERROR_LINE() AS VARCHAR(50)),
     @ErrorSeverity = ERROR_SEVERITY(),
     @ErrorState = ERROR_STATE();

  RAISERROR (@ErrorMessage, -- Message text.
     @ErrorSeverity, -- Severity.
     @ErrorState -- State.
  );

END CATCH

6

वास्तव में यह Error_number()बहुत अच्छा काम करता है।

यह फ़ंक्शन अंतिम GO (बैच सेपरेटर) स्टेटमेंट से मायने रखता है, इसलिए यदि आपने किसी भी गो स्पेस का उपयोग नहीं किया है और यह अभी भी एक गलत लाइन नंबर दिखा रहा है - तो इसमें 7 जोड़ें, जैसा कि लाइन नंबर 7 में स्टोरेज प्रक्रिया में बैच सेपरेटर स्वचालित रूप से उपयोग किया जाता है। इसलिए यदि आप कास्ट (Error_Number () + 7 को Int) के रूप में [Error_Number] का उपयोग करते हैं - तो आपको वांछित उत्तर मिलेगा।


1
if you have not used any Go spaces and it is still showing a wrong line number - then add 7 to it, as in stored procedure in line number 7 the batch separator is used automatically.- इसका क्या मतलब था?
अंडरस्कोर_ड

4

TSQL / संग्रहित प्रक्रियाओं में

आपको एक त्रुटि मिल सकती है जैसे:

Msg 206, स्तर 16, राज्य 2, प्रक्रिया myproc, लाइन 177 [बैच प्रारंभ लाइन 7]

इसका मतलब है कि बैच में लाइन 177 पर त्रुटि है। एसक्यूएल में 177 नहीं। आपको यह देखना चाहिए कि मेरे मामले में आपका बैच किस लाइन नंबर पर शुरू होता है, [7], और फिर आप उस नंबर को उस मूल्य में जोड़ते हैं जो यह कथन गलत है


2

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

CAST(ERROR_LINE() AS VARCHAR(50))

और यदि आप त्रुटि तालिका बनाना चाहते हैं तो आप इसका उपयोग कर सकते हैं:

INSERT INTO dbo.tbname( Source, Message) VALUES ( ERROR_PROCEDURE(), '[ ERROR_SEVERITY : ' + CAST(ERROR_SEVERITY() AS VARCHAR(50)) + ' ] ' + '[ ERROR_STATE : ' + CAST(ERROR_STATE() AS VARCHAR(50)) + ' ] ' + '[ ERROR_PROCEDURE : ' + CAST(ERROR_PROCEDURE() AS VARCHAR(50)) + ' ] ' + '[ ERROR_NUMBER : ' + CAST(ERROR_NUMBER() AS VARCHAR(50)) + ' ] ' +  '[ ERROR_LINE : ' + CAST(ERROR_LINE() AS VARCHAR(50)) + ' ] ' + ERROR_MESSAGE())

4
ध्यान दें कि ERROR_LINE () केवल संग्रहीत कार्यविधि के भीतर TRY / CATCH के CATCH भाग में उपलब्ध है। यदि आप त्रुटि को पकड़ नहीं पाते हैं, तो यह जिस SQL ​​सर्वर पर लौटता है, वही लाइन नंबर रिपोर्ट करता है। इसलिए जबकि यह उपयोगी हो सकता है, यह इस प्रश्न को हल करने में मदद नहीं करता है।
रिक

1

लंबा उत्तर: लाइन नंबर को CREATE PROCEDUREस्टेटमेंट से गिना जाता है , साथ ही किसी भी खाली लाइन या कमेंट लाइन्स को आप ऊपर ले सकते हैं जब आप वास्तव में CREATEस्टेटमेंट चलाते हैं , लेकिन GOस्टेटमेंट से पहले कोई भी लाइन्स नहीं गिनते हैं ...

मुझे इसकी पुष्टि करने के लिए आसपास के साथ खेलने के लिए एक संग्रहीत प्रॉप बनाने में बहुत आसान लगा:

GO

-- =============================================
-- Author:          <Author,,Name>
-- Create date: <Create Date,,>
-- Description:     <Description,,>
-- =============================================
CREATE PROCEDURE ErrorTesting
       -- Add the parameters for the stored procedure here
AS
BEGIN
       -- SET NOCOUNT ON added to prevent extra result sets from
       -- interfering with SELECT statements.
       SET NOCOUNT ON;

       -- Insert statements for procedure here
       SELECT 1/0

END
GO

आपके द्वारा इसे बनाए जाने के बाद, आप इसे देख सकते हैं ALTER PROCEDUREऔर टिप्पणियों के ऊपर और GOप्रभाव को देखने के लिए पहले कथन के ऊपर और नीचे कुछ रिक्त लाइनें जोड़ सकते हैं।

एक बहुत ही अजीब बात जो मैंने देखी वह यह थी कि मुझे EXEC ErrorTestingएक ही विंडो के नीचे इसे हाइलाइट करने और चलाने के बजाय एक नई क्वेरी विंडो में चलना था ... जब मैंने किया कि लाइन नंबर ऊपर जाते रहे! यकीन नहीं हुआ कि ऐसा क्यों हुआ ..


1

आप इस तरह से ब्लॉक में त्रुटि संदेश और त्रुटि लाइन प्राप्त कर सकते हैं:

'Ms Sql Server Error: - ' + ERROR_MESSAGE() + ' - Error occured at: ' + CONVERT(VARCHAR(20),  ERROR_LINE())
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.