Sp_executesql কি ডিফল্টরূপে কনফিগার / ব্যবহার করা যায়?


10

আমি এমন একটি অ্যাপ্লিকেশন দেখছি যা এসকিউএল সার্ভারের বিরুদ্ধে চূড়ান্ত গতিশীল এসকিএল কোয়েরি ব্যবহার করে। খুব অদ্ভুত এবং জটিল উপায়ে তৈরি করা প্রশ্নগুলির দিকে তাকানো, তবে এটি একটি ভিন্ন গল্প, আমি আমার নিজের জিনিসগুলি খুঁজে বের করতে (খুব বোকা) না থাকার একটা ভাল কারণ দেওয়ার জন্য বলি ... আমি দেখতে পাচ্ছি না যে কোনও কোড যেখানে প্রশ্নগুলি মোড়ানো রয়েছে sp_executesql

তবে যখন আমি ট্রেস করব, আমি দেখতে পাচ্ছি অনেকগুলি প্রশ্ন জড়িত sp_executesql। পুরো অ্যাপ্লিকেশন সলিউশনটিতে এমনকি কমান্ডটি মোটেই অন্তর্ভুক্ত sp_executesqlনয়।

সুতরাং আমি ভাবলাম এমন কোনও কনফিগারেশন রয়েছে যা আমি এখনও জানি না যা সফ্টওয়্যারটিকে ডিফল্টরূপে sp_executesql দিয়ে কোয়েরিগুলি মোড়ানোর জন্য বাধ্য করে?

এই আচরণের কারণ কী হতে পারে?

উত্তর:


11

এসকিউএল স্টেটমেন্টগুলির সাথে মোড়ানো হওয়ার কারণটি sp_executesqlহ'ল SqlCommand.Commandtypeসম্পত্তি সেট করা এবং কোনও প্যারামিটার কমান্ডে প্রেরণ করা।

SqlCommand cmd = new SqlCommand("proc1", con);
cmd.CommandType = CommandType.StoredProcedure;                
cmd.Parameters.AddWithValue("@param1", 1);
con.Open();
cmd.ExecuteNonQuery();
con.Close();

উপরের কোডটি এই টি-এসকিউএল দিয়ে শেষ হবে:

exec proc1 @param1=1
SqlCommand cmd = new SqlCommand("proc1", con);
cmd.CommandType = CommandType.Text;                
cmd.Parameters.AddWithValue("@param1", 1);
con.Open();
cmd.ExecuteNonQuery();
con.Close();

এই কোডটি নিম্নলিখিত টি-এসকিউএল কার্যকর করে শেষ হবে:

exec sp_executesql N'proc1',N'@param1 int',@param1=1

23.12.15 সংযোজন: একটি CommandType.Textকমান্ড ব্যবহার করে ফলাফলগুলি একই রকম হয়: শীঘ্রই কমান্ড অবজেক্টে একটি প্যারামিটার যুক্ত করা হয়, .NET পুরো ক্যোয়ারীটিকে আবদ্ধsp_executesql করে এতে প্যারামিটারগুলি পাস করবে।

সংযোজন: গভীরতর ডাইভিংয়ের পরে sp_executesql, পরামিতিগুলি শুকিয়ে যাওয়া এবং .NET ক্লাসগুলির এই আচরণটি ক্যাশে করার পরিকল্পনাটি উচ্চ ঘন ঘন ক্যোয়ারী সংকলন এবং পরিকল্পনার সংখ্যা এড়াতে পুরোপুরি অর্থে আসে। সুতরাং এটি মূলত সাধারণভাবে আরও ভাল এসকিউএল সার্ভারের পারফরম্যান্স নিশ্চিত করার জন্য তৈরি করা হয়েছে যখন এটি একই সাথে কিছু প্রশ্নের (প্যারামিটার স্নিফিং ইস্যু) দুর্বল পারফরম্যান্সের কারণ হতে পারে যা প্রাথমিকভাবে তৈরি ক্যোয়ারী পরিকল্পনার চেয়ে বিভিন্ন পরামিতি মানগুলির সাথে ব্যবহৃত হয়।

দেখা:

উপরের নমুনাটি .NET ফ্রেমওয়ার্ক 4.5 এবং এসকিউএল সার্ভার 2008 বিকাশকারী সংস্করণ ব্যবহার করে তৈরি করা হয়েছিল।


5

যদি এটি একটি নেট অ্যাপ্লিকেশন হয় তবে এটি সম্ভবত স্ক্যালকম্যান্ড.এক্সেকিউটরেডার () কল করার ফলাফল । প্রধান স্কেলকম্যান্ড শ্রেণীর পৃষ্ঠা অনুসারে , এক্সিকিউটআরডার এর অধীনে "মন্তব্যগুলি" বিভাগে পদ্ধতি বর্ণনার গ্রিডে এটি বলে:

সারিগুলি ফেরত দেওয়ার আদেশগুলি কার্যকর করে। বর্ধিত পারফরম্যান্সের জন্য, এক্সিকিউটআরডার ট্রানস্যাক্ট-এসকিউএল sp_executesql সিস্টেম সঞ্চিত পদ্ধতি ব্যবহার করে আদেশগুলি আহ্বান করে । অতএব, এক্সিকিউটিআরইডারের আপনার প্রভাবটি নাও থাকতে পারে যদি আপনি ট্রানজ্যাক্ট-এসকিউএল এসইটি স্টেটমেন্টগুলির মতো কমান্ডগুলি কার্যকর করতে ব্যবহার করেন।

তাদের বর্ণনাটি নিশ্চিত করার জন্য আমার এখন এটি পরীক্ষা করার সময় নেই, তবে একটি সাধারণ কনসোল অ্যাপ্লিকেশন তৈরি করা যথেষ্ট সহজ হওয়া উচিত যা খুব সাধারণ কল করে, কিছু ক্যোয়ারী পাঠ্যে পাস করে এবং একটি সরবরাহ করা পরামিতি সহ SqlParameter। আমার অনুমানটি হ'ল ExecuteNonQueryএবং ExecuteScalarএটিও sp_executesqlযেহেতু তারাও প্যারামিটারগুলিতে পাস করার অনুমতি দেয় তাই কেন এটি কার্যকর করা হয় তার জন্য আলাদা পথ থাকবে কেন?

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