এসকিউএল সার্ভার ব্যবহার করে একটি সঞ্চিত পদ্ধতিতে ডায়নামিক এসকিউএল কমান্ড কার্যকর করার ক্ষেত্রে সত্যিকারের বিশ্বরক্ষী ও কনস কী
EXEC (@SQL)
বনাম
EXEC SP_EXECUTESQL @SQL
?
এসকিউএল সার্ভার ব্যবহার করে একটি সঞ্চিত পদ্ধতিতে ডায়নামিক এসকিউএল কমান্ড কার্যকর করার ক্ষেত্রে সত্যিকারের বিশ্বরক্ষী ও কনস কী
EXEC (@SQL)
বনাম
EXEC SP_EXECUTESQL @SQL
?
উত্তর:
sp_executesqlক্যোয়ারী প্ল্যান পুনঃব্যবহারের প্রচারের সম্ভাবনা বেশি। ব্যবহার করার সময় sp_executesql, পরামিতিগুলি কলিং স্বাক্ষরে স্পষ্টভাবে চিহ্নিত করা হয়। এই দুর্দান্ত নিবন্ধটি এই প্রক্রিয়াটি ঘৃণা করে ।
ডায়নামিক স্কয়ারের অনেক দিকের দ্য টু রেফারেন্সটি হল এরল্যান্ড সোমমারস্কোগের অবশ্যই পড়তে হবে: " ডাইনামিক এসকিউএল এর অভিশাপ এবং আশীর্বাদ "।
SP_EXECUTESQL সম্পর্কে বড় কথা হ'ল এটি আপনাকে প্যারামিটারাইজড কোয়েরি তৈরি করতে দেয় যা আপনি এসকিউএল ইঞ্জেকশনটির বিষয়ে যত্নশীল হলে খুব ভাল।
মাইক্রোসফ্ট এর ব্যবহার sp_executesql নিবন্ধ বিবৃতি sp_executesqlপরিবর্তে ব্যবহার করার পরামর্শ দেয় execute।
যেহেতু এই সঞ্চিত পদ্ধতিটি প্যারামিটারের বিকল্পটিকে সমর্থন করে , sp_executesql এক্সেকিউটির চেয়ে বহুমুখী; এবং কারণ sp_executesql এক্সিকিউশন পরিকল্পনা উত্পন্ন করে যা এসকিউএল সার্ভার দ্বারা পুনরায় ব্যবহারের সম্ভাবনা বেশি , sp_executesql এক্সেকিউটির চেয়ে বেশি দক্ষ ।
সুতরাং, গ্রহণ দূরে: বিবৃতি ব্যবহার করবেন নাexecute । ব্যবহার sp_executesql।
sp_executesqlপ্রতিস্থাপনের জন্য ব্যবহার করা যায় না execute। আমি যে পয়েন্টটি আমি চাপ দেওয়ার চেষ্টা করছি তাতে সম্ভবত আমার বক্তব্য রাখা উচিত: যখনই সম্ভব হয়sp_executesql তার পরিবর্তে ব্যবহার করুন । execute
এই দিনগুলিতে আমি সবসময়ই sp_executesql ব্যবহার করব, এটি সত্যিই এক্সইসি জন্য একটি মোড়ক যা পরামিতি এবং ভেরিয়েবলগুলি পরিচালনা করে।
তবে খুব বড় ডেটাবেসগুলিতে কোয়েরিগুলি টিউন করার সময় বিকল্প পুনরুদ্ধার সম্পর্কে ভুলে যাবেন না, বিশেষত যেখানে আপনার একাধিক ডাটাবেসের উপরে ডেটা রয়েছে এবং সূচক স্ক্যানগুলি সীমাবদ্ধ করতে একটি নিয়ন্ত্রণ ব্যবহার করছেন।
আপনি অপশন পুনরুদ্ধার না করা অবধি এসকিউএল সার্ভার আপনার ক্যোয়ারির জন্য "একটি আকারে সমস্ত মাপসই করা যায়" এক্সিকিউশন প্ল্যান তৈরির চেষ্টা করবে এবং প্রতিবার যখন এটি চালানো হবে তখন একটি সম্পূর্ণ সূচক স্ক্যান চালাবে।
এটি কোনও সন্ধানের চেয়ে অনেক কম দক্ষ এবং এর অর্থ এটি সম্ভাব্যভাবে সমস্ত সূচকগুলি স্ক্যান করছে যা আপনাকে এমনকি জিজ্ঞাসা করছে না এমন সীমার মধ্যে সীমাবদ্ধ রয়েছে: @
কমান্ড কার্যকর করুন
declare @sql varchar (100)
set @sql ='select * from #td1'
if (@IsMonday+@IsTuesday !='')
begin
set @sql= @sql+' where PickupDay in ('''+@IsMonday+''','''+@IsTuesday+''' )'
end
exec( @sql)
intডায়নামিক এসকিউএল হতে পারে না । নোট করুন যে @ এসকিউএল হিসাবে varcharবা হিসাবে ঘোষণা করা হয়েছেnvarchar