আমি কীভাবে টিএসকিউএল-এ প্রিন্ট বাফারটি ফ্লাশ করব?


220

আমার এসকিউএল সার্ভার ২০০৫-এ একটি দীর্ঘ-চলমান সঞ্চিত প্রক্রিয়া রয়েছে যা আমি ডিবাগ করার চেষ্টা করছি এবং এটি করার জন্য আমি 'মুদ্রণ' কমান্ডটি ব্যবহার করছি। সমস্যাটি হ'ল আমি আমার স্প্রোকের একেবারে শেষে এসকিউএল সার্ভার থেকে বার্তাগুলি ফিরিয়ে আনছি - আমি ম্যাসেজ বাফারটি ফ্লাশ করতে সক্ষম হব এবং স্প্রোকের রানটাইম চলাকালীন এই বার্তাটি তাত্ক্ষণিকভাবে দেখার চেয়ে ততক্ষণে দেখতে সক্ষম হব শেষ.


1
এমন লোকদের জন্য কেবল একটি ছোট্ট বিজ্ঞপ্তি (আমার মতো) মনে করে যে উত্তরগুলি তাদের পক্ষে কার্যকর হয় না: কোয়েরিটি চলমান থাকলে "বার্তা" ট্যাবে স্যুইচ করতে ভুলবেন না। ডিফল্টরূপে আপনি "ফলাফল" ট্যাবটি দেখতে পাবেন।
টমাসজ গেন্ডার

উত্তর:


305

RAISERRORফাংশনটি ব্যবহার করুন :

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

আপনার সমস্ত প্রিন্ট পুরোপুরি রেজারার দিয়ে প্রতিস্থাপন করা উচিত নয়। আপনার যদি কোথাও একটি লুপ বা বড় কার্সার থাকে তবে কেবল এটি পুনরাবৃত্তি প্রতি একবার বা দুবার বা এমনকি প্রতি কয়েকবার পুনরাবৃত্তি করুন।

এছাড়াও: আমি প্রথম এই লিঙ্কটিতে রেজারার সম্পর্কে জানতে পেরেছিলাম, যা আমি এখন এসকিউএল সার্ভার ত্রুটি পরিচালনার জন্য চূড়ান্ত উত্স হিসাবে বিবেচনা করি এবং অবশ্যই এটি পড়ার পক্ষে মূল্যবান:
http://www.sommarskog.se/error-handling-I.html


41
মনে রাখবেন যে এসকিউএল-এ ট্রাই / ক্যাচ কেবল তীব্রতা> 10 এর সাথে ত্রুটিগুলি ধরবে, সুতরাং এইভাবে রাইজার ব্যবহার করে আপনার ক্যাচ স্টেটমেন্টে লাফিয়ে ওঠে না। কোনটি দুর্দান্ত, কারণ এর অর্থ আপনি এখনও ট্রাই / ক্যাচ দিয়ে এই জাতীয়ভাবে রাইজার ব্যবহার করতে পারেন। রেফ: এমএসডিএন.মাইক্রোসফটকম /en-us/library/ms175976.aspx
ররি

13
নোট করুন যে এটি প্রথম 500 টি বার্তার পরে কাজ করে না; আপনি একবার এর চেয়ে বেশি মুদ্রণ করলে হঠাৎ এটি বাফার শুরু হয়!
GendoIkari

@ মাহমুদমোরেভেজ না, আমি এখনও রাইসিররর ব্যবহার করে দীর্ঘ-চলমান প্রক্রিয়া চালিয়ে যাচ্ছি এবং কেবল এই বিষয়টি নিয়েই কাজ করছি যে কিছুক্ষণ পরেই বার্তা বারবার শুরু হয়। এসএসএমএস ব্যতীত অন্য কোনও সরঞ্জাম ব্যবহার করা একমাত্র সমাধান হতে পারে।
GendoIkari

1
আমি মনে করি এটি এমন একটি বিষয় যা এসএসের সাম্প্রতিক সংস্করণে পরিবর্তিত হয়েছিল। যখন আমি প্রথম এটি লিখেছিলাম তখন আমরা ৫০০ এরও বেশি বার্তা নিয়ে রাতারাতি ব্যাচ প্রক্রিয়াগুলিতে ব্যাপক লগিংয়ের জন্য রেসার ব্যবহার করি, এবং এটি কোনও সমস্যা ছিল না। তবে 7 বছরে অনেক কিছুই পরিবর্তন হতে পারে।
জোয়েল কোহর্ন

1
@ জেন্ডোআইকারির নোটিশে At আমি এই স্ক্রিপ্টটি দিয়ে ২০১SP এসএসপি থেকে এসএমএস দিয়ে চেষ্টা করেছি। 500 এ এটি 50 টি লাইনে বাফারিংয়ে স্যুইচ করে এবং 1 কে এটি প্রতিটি 100 লাইনগুলিতে স্যুইচ করে। এটি কমপক্ষে 2k অবধি অব্যাহত ছিল তবে আমি স্ক্রিপ্টটি বন্ধ করে দিয়েছি। @ i int সেট @ i = 0 @t বারচর (১০০) ঘোষণা করুন, যদিও ১ = ১ শুরু করুন @ i = @ i + 1 সেট @t = 'মুদ্রণ' + রূপান্তর (বার্তা, @ আই) রেজারার (@ টি, 10) , 1) NOWAIT অপেক্ষা অপেক্ষা করতে দেরি '00: 00: 00.010 'শেষ
জার্ট্যাগ

28

@ জোয়েলকোহুর দ্বারা উত্তরের ভিত্তিতে আমার দৃষ্টিভঙ্গিটি হ'ল আমার সমস্ত প্রিন্ট স্টেটমেন্টগুলি জায়গায় রেখে দেওয়া, এবং ফ্লাশের কারণ হিসাবে কেবল তাদের রেসারের বিবৃতি সহ অনুসরণ করুন।

উদাহরণ স্বরূপ:

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

এই পদ্ধতির সুবিধা হ'ল প্রিন্টের বিবৃতিগুলি স্ট্রিংগুলিকে একত্রিত করতে পারে, তবে রেসরার পারে না। (সুতরাং উভয় উপায়েই আপনার কোডের একই লাইন রয়েছে, যেমন আপনাকে RAISERROR এ ব্যবহারের জন্য ভেরিয়েবল ঘোষণা করতে এবং সেট করতে হবে)।

যদি আমার মতো আপনি অটোহটকি বা এসএসএমএস বুস্ট বা সমমানের সরঞ্জাম ব্যবহার করেন তবে আপনি সহজেই আপনার জন্য রাইজারের লাইনে প্রবেশের জন্য "] ফ্লাশ" এর মতো একটি শর্টকাট সেট আপ করতে পারেন। এটি প্রতিবার একই কোডের লাইন হলে এটি আপনার সময় সাশ্রয় করে, যেমন নির্দিষ্ট পাঠ্য বা একটি ভেরিয়েবল ধরে রাখতে কাস্টমাইজ করার দরকার নেই।


6
নোটটি RAISERROR()সমর্থন করে printf()স্টাইল স্ট্রিং ইন্টারপোলেশন করে। উদাহরণস্বরূপ, যদি @MyVariableNameএকটি stringish টাইপ (যেমন, হয় VARCHAR(MAX), NVARCHAR(MAX)ইত্যাদি), আপনি ব্যবহার করতে পারেন RAISERROR(): এক লাইন দিয়ে RAISERROR(N'MyVariableName: %s', 0, 1, @MyVariableName)
বিনকি

এটি এত সুবিধাজনক! আমি জানি যে রেসরার কিছু সাধারণ প্রতিস্থাপন করতে পারে তবে একটি [তারিখ] সময় প্রতিস্থাপন করার চেষ্টা করবে, বা রেসরার স্টেটমেন্টের ভিতরে থেকে কোনও ফাংশন কল করার চেষ্টা করবে! এই উত্তরটি আপনাকে খালি ত্রুটি বাড়ানোর আকারে (একটি নতুন লাইনের মূল্যে) একটি সাধারণ এফএলএসএইচ দেয়।
টমাসজ গ্যান্ডার

19

হ্যাঁ ... RAISERROR ফাংশনের প্রথম প্যারামিটারের জন্য একটি এনভিচারার ভেরিয়েবল দরকার। সুতরাং নিম্নলিখিত চেষ্টা করুন;

-- 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

10
ফলাফল ট্যাবের পাশের নীচে বার্তাগুলি ট্যাবটি দেখুন বা ফলাফলগুলিতে পাঠ্য মোডে স্যুইচ করুন।
মেহমেট এরগুট

ফলাফলগুলিকে পাঠ্য মোডে স্যুইচ করতে, এসএসএমএসে, মেনু সরঞ্জামগুলি -> বিকল্পগুলি -> অনুসন্ধানের ফলাফল -> এসকিউএল সার্ভার -> সাধারণ -> ফলাফলের জন্য ডিফল্ট গন্তব্য, এবং "গ্রিডে ফলাফলগুলি" পরিবর্তে "পাঠ্যে ফলাফলগুলি" নির্বাচন করুন, আবার ক্যোয়ারী উইন্ডোটি খুলুন এবং তারপরে আপনি সেখানে ডামির মতো ফাঁকা ফলাফল ট্যাবটির দিকে তাকিয়ে থাকবেন না, যখন RAISERROR আউটপুট বার্তা ট্যাবে যাবে tab
আদম

12

আর একটি ভাল বিকল্প হ'ল PRINT বা RAISERROR এর উপর নির্ভর না করে কেবলমাত্র আপনার "মুদ্রণ" বিবৃতিগুলি টেম্পডিবিতে একটি ## টেম্প টেবিল বা আপনার ডাটাবেসে একটি স্থায়ী টেবিলের মধ্যে লোড করুন যা অন্য উইন্ডো থেকে একটি নির্বাচনী বিবৃতি দিয়ে তাত্ক্ষণিকভাবে আপনাকে ডেটাতে দৃশ্যমানতা দেবে । এটি আমার পক্ষে সবচেয়ে ভাল কাজ করে। স্থায়ী টেবিল ব্যবহার করে অতীতে যা ঘটেছিল তার লগ হিসাবে কাজ করে। মুদ্রণ বিবৃতিগুলি ত্রুটিগুলির জন্য কার্যকর, তবে লগ টেবিলটি ব্যবহার করে আপনি সেই নির্দিষ্ট নির্বাহের জন্য সর্বশেষ লগ করা মানটির উপর ভিত্তি করে ব্যর্থতার সঠিক পয়েন্টটিও নির্ধারণ করতে পারেন (ধরে নিলে আপনি আপনার লগ টেবিলের মধ্যে সার্বিক এক্সিকিউশন শুরুর সময়টিকে ট্র্যাক করে ধরেছেন।)


2
আপনি যদি কমিট এবং রোলব্যাক দিয়ে সত্যিকারের লেনদেনের স্ক্রিপ্ট লিখছেন তবে এটি একটি সমস্যা হতে পারে। আমি বিশ্বাস করি না যে আপনি নিজের টেম্প টেবিলটিকে সরাসরি জিজ্ঞাসা করতে সক্ষম হবেন - এবং আপনার লেনদেন ব্যর্থ হলে এটি চলে যাবে।
স্টিভজে

@ স্টেজেজে আপনি SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;আপনার পর্যবেক্ষণ সেশনে ব্যবহার করে এটি সরাসরি জিজ্ঞাসা করতে পারেন
TheConstructor

1
@ দ্য কনস্ট্রাক্টর; এটি একটি সহায়ক টিপ - আমি এটি ব্যবহার করব, ধন্যবাদ। তবে, আমরা এখনও টেম্প টেবিলটি রোলব্যাকের সাথে চলে যাচ্ছি না? যদি ব্যর্থতা বিশ্লেষণ করে থাকেন তবে মনে হচ্ছে এটি একটি বড় ঘাটতি হবে।
স্টিভজে

1
@ স্টেভেজে হ্যাঁ, এটি অবশ্যই আছে। আপনি অবশ্যই READ UNCOMMITTEDকোনও অন্য টেবিলের লেনদেনে ডেটা অনুলিপি করতে পারেন , তবে আপনি সম্ভবত এই মুহুর্তটি খুব আগেই মিস করবেন ROLLBACK। সুতরাং এটি সম্ভবত 'কতদূর' সমাধান করে? না কেন 'রোলব্যাক?'
TheConstructor

4

কেবলমাত্র রেফারেন্সের জন্য, আপনি যদি স্ক্রিপ্টগুলিতে (ব্যাচ প্রসেসিং) কাজ করেন, সঞ্চিত পদ্ধতিতে নয় , ফ্লাশিং আউটপুট GO কমান্ড দ্বারা ট্রিগার করা হয়, যেমন

print 'test'
print 'test'
go

সাধারণভাবে, আমার উপসংহারটি নিম্নলিখিত: এমএসকিএল স্ক্রিপ্ট এক্সিকিউশন আউটপুট, এসএমএস জিইউআই বা sqlcmd.exe সহ নির্বাহ করা হয়, প্রথম জিও স্টেটমেন্টে স্ক্রিপ্টের শেষে বা স্ক্রিপ্টের শেষ পর্যন্ত ফাইল, স্টডআউটপুট, গুই উইন্ডোতে ফ্লাশ করা হয়।

সঞ্চিত পদ্ধতির অভ্যন্তরে ফ্লাশিং আলাদাভাবে ফাংশন করে, যেহেতু আপনি GO ভিতরে রাখতে পারবেন না।

তথ্যসূত্র: tsql গো বিবৃতি


2
goকেবল আউটপুট ফ্লাশ করে না, এটি আপনার সরবরাহিত লিঙ্ক অনুযায়ী ব্যাচটি শেষ করে। আপনি declareযা কিছু করেন তা বাতিল করা হয়, তাই ডিবাগিংয়ের জন্য খুব ব্যবহারযোগ্য নয়। declare @test int print "I want to read this!" go set @test=5যদিও আপনার দাবিতে কোনও ত্রুটি @testঅনির্ধারিত হয়েছে কারণ এটি একটি নতুন ব্যাচে রয়েছে।
asontu

1
আমি সম্মত, এটি এই প্রশ্নের যথাযথ উত্তর নয়, তবে আমি উত্তরটি (শুরুতে অস্বীকৃতি দেখুন) রেখেছি যেহেতু এটি অন্য কারওর পক্ষে কার্যকর হতে পারে - যেমন ব্যাচ স্কয়ার চালায় এমন কেউ someone
রবার্ট লুজো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.