আমি কীভাবে একটি ত্রুটি বার্তা থেকে প্রকৃত সঞ্চিত পদ্ধতি লাইন নম্বর পেতে পারি?


110

আমি যখন এসকিউএল সার্ভার ব্যবহার করি এবং ত্রুটি থাকে তখন ত্রুটি বার্তাটি একটি লাইন নম্বর দেয় যা সঞ্চিত পদ্ধতিতে লাইন নম্বরগুলির সাথে কোনও সম্পর্ক নেই। আমি ধরে নিয়েছি যে পার্থক্যটি সাদা স্থান এবং মন্তব্যের কারণে, তবে এটি কি সত্যি?

আমি এই দুটি সেট লাইন নম্বর একে অপরের সাথে কীভাবে সম্পর্কযুক্ত করতে পারি? যদি কেউ আমাকে কমপক্ষে সঠিক দিক নির্দেশক দিতে পারে তবে আমি সত্যিই এটির প্রশংসা করব।

আমি এসকিউএল সার্ভার 2005 ব্যবহার করছি।


1
আমি মনে করি লাইন নম্বরটি প্রোকের শরীরের সাথে সম্পর্কিত। অর্থাত হেডার উপেক্ষা করুন।
মার্টিন স্মিথ


হেডার শেষ হয় কোথায়? শুরুর পরে যে পরিবর্তন পদ্ধতি অনুসরণ করে ... এএস?
চামা

create procআমার পরীক্ষায় লাইন থেকে গণনা শুরু হয়েছিল বলে মনে হয়েছিল । আমি ধরে নিচ্ছি আপনি কিছু আলাদা দেখছেন।
মার্টিন স্মিথ

1
আমার উত্তর এখানে বর্ণনা stackoverflow.com/questions/2947173/...
gbn

উত্তর:


113

আইআইআরসি, এটি ব্যাচের শুরু থেকে লাইন গণনা শুরু করে যা সেই প্রকোপ তৈরি করেছিল। এর অর্থ হয় স্ক্রিপ্টের সূচনা, না হলে প্রোক স্টেটমেন্ট তৈরি / পরিবর্তন করার আগে শেষ "জিও" বিবৃতি।

এটি দেখার একটি সহজ উপায় হ'ল বস্তুটি তৈরি করার সময় এসকিউএল সার্ভার যে প্রকৃত পাঠ্যটি ব্যবহার করেছিল তা টানতে। আপনার আউটপুটটিকে পাঠ্য মোডে স্যুইচ করুন (ডিফল্ট কী ম্যাপিং সহ CTRL-T) এবং রান করুন

sp_helptext proc_name

সিনট্যাক্স হাইলাইটিং ইত্যাদি পেতে ফলাফলটিকে একটি স্ক্রিপ্ট উইন্ডোতে অনুলিপি করুন এবং প্রতিবেদন করা ত্রুটি লাইনে যাওয়ার জন্য গোটো লাইন ফাংশন (সিটিআরএল-জি আমি মনে করি) ব্যবহার করুন।


14
আমি যখন গ্রিড-আউটপুট মোডে এটি করেছি, তখন এটি লাইন নম্বরগুলিকে খুব বেশি আটকে দিয়েছে
কোডুলাইক

2
@ কোডেলাইক - ভাল কথা, আপনি গ্রিড আউটপুট ব্যবহার করলে সারি নম্বর লাইন নম্বরটির সাথে মিলবে, সুতরাং আপনাকে সিটিআরএল + জি ব্যবহার করার দরকার নেই। গ্রিড আউটপুট নিয়ে আমার একমাত্র সমস্যা হ'ল এটি ট্যাব অক্ষরগুলিকে একটি একক স্পেসে পরিবর্তন করে, তাই আপনি সমস্ত বিন্যাস হারাবেন।
রিক

32

অভ্যাসের বাইরে আমি LINENO 0সরাসরি BEGINআমার সঞ্চিত পদ্ধতিতে রাখি। এটি লাইন নম্বরটি পুনরায় সেট করে - এক্ষেত্রে শূন্যে। তারপরে এসএসএমএসে লাইন নম্বরটিতে ত্রুটি বার্তার দ্বারা উল্লিখিত লাইন নম্বরটি যুক্ত করুন যেখানে আপনি লিখেছেন LINENO 0এবং বিঙ্গো - আপনার কাছে ক্যোয়ারী উইন্ডোতে উপস্থাপিত হিসাবে ত্রুটির লাইন নম্বর রয়েছে।


4
কেন আপনি কেবল "লাইননো এক্স" রাখবেন না যেখানে আপনার বক্তব্যটি রেখার জন্য লাইন নম্বরটি এক্স =, যাতে এটি স্বয়ংক্রিয়ভাবে রিপোর্ট করা লাইন নম্বরটিতে যুক্ত হয়?
ল্যারিবুড

8

আপনি যদি ব্লক ব্যবহার করেন এবং চেষ্টা করুন ব্লকের মধ্যে যে কোনও কোডের বৈধতার জন্য একটি রেসরার () ব্যবহার করেন তবে ত্রুটি লাইনটি ক্যাপ ব্লকটি কোথায় রয়েছে এবং যেখানে আসল ত্রুটি ঘটেছে তা নয় reported আমি এটি পরিষ্কার করতে এটির মতো ব্যবহার করেছি।

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()খুব ভাল কাজ করে।

এই ফাংশনটি সর্বশেষ জিও (ব্যাচ বিভাজক) বিবৃতি থেকে গণনা শুরু করে, সুতরাং আপনি যদি কোনও গো স্পেস ব্যবহার না করে থাকেন এবং এটি এখনও একটি ভুল লাইন নম্বর দেখায় - তবে ব্যাচের বিভাজক line নং লাইনের সঞ্চিত পদ্ধতি হিসাবে এটিতে add যুক্ত করুন স্বয়ংক্রিয়ভাবে ব্যবহৃত হয়। সুতরাং যদি আপনি [ত্রুটি_সংখ্যা] হিসাবে কাস্ট (ত্রুটি_ নম্বর () + 7 ইন্ট হিসাবে) ব্যবহার করেন - আপনি পছন্দসই উত্তর পাবেন।


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

টিএসকিউএল / সঞ্চিত পদ্ধতিতে

আপনি যেমন একটি ত্রুটি পেতে পারেন:

এমএসজি 206, স্তর 16, রাজ্য 2, পদ্ধতি মাইপ্রোক, লাইন 177 [ব্যাচ শুরু লাইন 7]

এর অর্থ ব্যাচটিতে ত্রুটিটি 177 লাইনে রয়েছে। এসকিউএলে 177 নয়। আপনার ক্ষেত্রে আমার ব্যাচটি কোন লাইন নম্বরটি শুরু হয় তা আপনার ক্ষেত্রে দেখা উচিত []], এবং তারপরে কোন বিবৃতিটি ভুল তা খুঁজে পেতে আপনি সেই মানটি লাইন নম্বরটিতে যুক্ত করুন


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 এর ক্যাচ অংশে উপলব্ধ। এটি ত্রুটিটি না ধরলে এসকিউএল সার্ভার যে লাইন নম্বরটি জানিয়েছে এটি একই। যেহেতু এটি কার্যকর হতে পারে, এটি এই প্রশ্নটি সমাধান করতে সহায়তা করে না।
রিক

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())
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.