ডায়নামিক এসকিউএল - এক্সইসি (@ এসকিউএল) বনাম এক্সেক এসপি_এক্সইকিউটিএসকিউএল (@ এসকিউএল)


95

এসকিউএল সার্ভার ব্যবহার করে একটি সঞ্চিত পদ্ধতিতে ডায়নামিক এসকিউএল কমান্ড কার্যকর করার ক্ষেত্রে সত্যিকারের বিশ্বরক্ষী ও কনস কী

EXEC (@SQL)

বনাম

EXEC SP_EXECUTESQL @SQL

?

উত্তর:


96

sp_executesqlক্যোয়ারী প্ল্যান পুনঃব্যবহারের প্রচারের সম্ভাবনা বেশি। ব্যবহার করার সময় sp_executesql, পরামিতিগুলি কলিং স্বাক্ষরে স্পষ্টভাবে চিহ্নিত করা হয়। এই দুর্দান্ত নিবন্ধটি এই প্রক্রিয়াটি ঘৃণা করে

ডায়নামিক স্কয়ারের অনেক দিকের দ্য টু রেফারেন্সটি হল এরল্যান্ড সোমমারস্কোগের অবশ্যই পড়তে হবে: " ডাইনামিক এসকিউএল এর অভিশাপ এবং আশীর্বাদ "।


21

SP_EXECUTESQL সম্পর্কে বড় কথা হ'ল এটি আপনাকে প্যারামিটারাইজড কোয়েরি তৈরি করতে দেয় যা আপনি এসকিউএল ইঞ্জেকশনটির বিষয়ে যত্নশীল হলে খুব ভাল।


4
আমি মনে করি না আপনি এটি ব্যতীত একটি গতিশীল স্কয়ারকে প্যারামেটাইজ করতে পারবেন ??
ডিজে।

এক্সেক ('ফুল থেকে কোথাও নির্বাচন করুন আইডি =?', 123) পরামিতি স্থানধারককে প্রতিস্থাপন করবে? " 123 এর মান সহ এবং তারপরে ক্যোয়ারিটি
সম্পাদন

4
ওফস, সেই সিনট্যাক্সটি কেবলমাত্র লিঙ্কযুক্ত সার্ভারের জন্যই উপলব্ধ।
পিটার জে

4
এসকিএল ইনজেকশন প্রতিরোধ করতে গতিশীলভাবে ক্যোয়ারী তৈরি করা হলে sp_executesql ব্যবহার করার একেবারে বৃহত্তম কারণ।
স্টিভেন রজার্স

5

মাইক্রোসফ্ট এর ব্যবহার sp_executesql নিবন্ধ বিবৃতি sp_executesqlপরিবর্তে ব্যবহার করার পরামর্শ দেয় execute

যেহেতু এই সঞ্চিত পদ্ধতিটি প্যারামিটারের বিকল্পটিকে সমর্থন করে , sp_executesql এক্সেকিউটির চেয়ে বহুমুখী; এবং কারণ sp_executesql এক্সিকিউশন পরিকল্পনা উত্পন্ন করে যা এসকিউএল সার্ভার দ্বারা পুনরায় ব্যবহারের সম্ভাবনা বেশি , sp_executesql এক্সেকিউটির চেয়ে বেশি দক্ষ

সুতরাং, গ্রহণ দূরে: বিবৃতি ব্যবহার করবেন নাexecute । ব্যবহার sp_executesql


7
আপনার গ্রহণযোগ্যতা সর্বদা দাঁড়ায় না। এমন উপলক্ষ আছে যখন sp_executesql ব্যবহার করে কোনও দক্ষতা বোনাস না পাওয়া যায় তবে আপনি নিজের কোডটি স্কয়ার ইঞ্জেকশন আক্রমণ থেকে রক্ষা করতে পারেন। কখনও কখনও আপনি যেভাবে এক্সিকিউটিভ ব্যবহার করতে পারেন সেইভাবে sp_executesql ব্যবহার করতে পারবেন না, তাই ... কেউ বলেছিল - কোনও রূপালী বুলেট নেই। আমি রাজী.
ওজরেনটাক্যালসেক্রজনারিক

হ্যাঁ, মাইক্রোসফ্টকে এটিকে " দক্ষ হওয়ার সম্ভাবনা বেশি" হিসাবে রাখা উচিত ছিল । এবং কয়েক বছর ধরে শিল্পে থাকাকালীন, আমি এমন কেসগুলি দেখেছি যেখানে sp_executesqlপ্রতিস্থাপনের জন্য ব্যবহার করা যায় না execute। আমি যে পয়েন্টটি আমি চাপ দেওয়ার চেষ্টা করছি তাতে সম্ভবত আমার বক্তব্য রাখা উচিত: যখনই সম্ভব হয়sp_executesql তার পরিবর্তে ব্যবহার করুন । execute
গণ

2

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

তবে খুব বড় ডেটাবেসগুলিতে কোয়েরিগুলি টিউন করার সময় বিকল্প পুনরুদ্ধার সম্পর্কে ভুলে যাবেন না, বিশেষত যেখানে আপনার একাধিক ডাটাবেসের উপরে ডেটা রয়েছে এবং সূচক স্ক্যানগুলি সীমাবদ্ধ করতে একটি নিয়ন্ত্রণ ব্যবহার করছেন।

আপনি অপশন পুনরুদ্ধার না করা অবধি এসকিউএল সার্ভার আপনার ক্যোয়ারির জন্য "একটি আকারে সমস্ত মাপসই করা যায়" এক্সিকিউশন প্ল্যান তৈরির চেষ্টা করবে এবং প্রতিবার যখন এটি চালানো হবে তখন একটি সম্পূর্ণ সূচক স্ক্যান চালাবে।

এটি কোনও সন্ধানের চেয়ে অনেক কম দক্ষ এবং এর অর্থ এটি সম্ভাব্যভাবে সমস্ত সূচকগুলি স্ক্যান করছে যা আপনাকে এমনকি জিজ্ঞাসা করছে না এমন সীমার মধ্যে সীমাবদ্ধ রয়েছে: @


-2
  1. চলকটি ঘোষণা করুন
  2. এটি আপনার কমান্ডের সাহায্যে সেট করুন এবং এসপি এর প্যারামিটার মানগুলি ব্যবহারের মতো গতিশীল অংশ যুক্ত করুন (এখানে @ আইসএমডে এবং @ আইসটিগ্রহে এসপি প্যারাম রয়েছে)
  3. কমান্ড কার্যকর করুন

    declare  @sql varchar (100)
    set @sql ='select * from #td1'
    
    if (@IsMonday+@IsTuesday !='')
    begin
    set @sql= @sql+' where PickupDay in ('''+@IsMonday+''','''+@IsTuesday+''' )'
    end
    exec( @sql)
    

15
এটি এসকিউএল ইঞ্জেকশনের জন্য উন্মুক্ত, যদি আপনি উদাহরণস্বরূপ "a"; ড্রপ DATABASE DATABASE_NAME; জিও; '; @ ইসমন্ডে ভেরিয়েবলে
এরিক এ। ব্র্যান্ডস্টাডমোইন

@ ইসমন্ডে ইন্টি থাকলে এটি কি এসকিএল ইঞ্জেকশন প্রবণ?
বিকাশ রানা

@ ভিকাসরানা @ আইসএমডে intডায়নামিক এসকিউএল হতে পারে না । নোট করুন যে @ এসকিউএল হিসাবে varcharবা হিসাবে ঘোষণা করা হয়েছেnvarchar
গুও
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.