এসকিউএল সার্ভারে ফাংশন বনাম সঞ্চিত পদ্ধতি


828

আমি বেশ কিছুদিন ধরে ফাংশন এবং সঞ্চিত পদ্ধতি শিখছি তবে কেন এবং কখন কোন ফাংশন বা সঞ্চিত পদ্ধতি ব্যবহার করা উচিত তা আমি জানি না। তারা আমার সাথে একই দেখাচ্ছে, কারণ আমি এ সম্পর্কে দম্পতি নবাগত।

কেউ আমাকে বলতে পারেন কেন?





3
গতি কেমন? একই প্রশ্নটি কোনটি দ্রুত চালায়?
আমিনিদিমি

উত্তর:


708

ফাংশনগুলি গণিত মান হয় এবং স্থায়ী পরিবেশগত পরিবর্তন করতে পারে না SQL Server(যেমন, কোনও INSERTবা UPDATEবিবৃতি অনুমোদিত নয়)।

একটি ফাংশন ইনলাইন ব্যবহার করা যেতে পারে SQL যদি এটি কোনও স্কেলারের মান ফেরত দেয় বা কোনও ফলাফলের সেট দেয় তবে তাতে যোগ দেওয়া যায়।

মন্তব্যগুলি লক্ষ করার মতো একটি বিষয়, যা উত্তরটির সংক্ষিপ্তসার করে। @ সিয়ান কে অ্যান্ডারসনকে ধন্যবাদ:

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

কীভাবে SQLস্টোর পদ্ধতি থেকে ফাংশন কল করা যায় এবং আমরা যখন সঞ্চিত পদ্ধতির পরিবর্তে কোনও ফাংশন ব্যবহার করি।

হাই বন্ধুরা, আজ আমরা কখন সঞ্চিত পদ্ধতি ব্যবহার করব এবং কখন ফাংশনটি ব্যবহার করব তা নিয়ে আলোচনা করব। সাধারণ দলে আপনি যদি কিছু মান গণনা করতে চান এবং এটি একটি একক মান ফেরত দেবে, সুতরাং এটির প্রয়োজন নেই:

https://programmingtechtutorial.blogspot.com/2020/01/when-use-storeprocedure-and-when-use.html


13
মূলত কোনও ডিএমএলের অনুমতি নেই?
ডেভিড ব্লেইন

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

23
প্রকৃতপক্ষে স্থানীয় টেবিলের ভেরিয়েবলগুলি সংশোধন করার জন্য আপনার কোনও কার্যক্রমে INSERT, আপডেট এবং বিবৃতি মুছে ফেলতে পারে।
আনি

14
@ অ্যানি - আপনি কোনও ফাংশন সহ স্থানীয় ভেরিয়েবলগুলির সংখ্যা ইনস্ট্যান্টিয়েট এবং সংশোধন করতে পারেন তবে আপনি ফাংশনের ক্ষেত্রের বাইরে কিছু পরিবর্তন করতে পারবেন না।
মাইআইচ্চিচিন

40
@ সানকেএন্ডারসন ফাংশনটির "কমপক্ষে একটি প্যারামিটার থাকতে হবে" সত্য নয়।
লিয়াং

623

এসপি এবং ইউডিএফ মধ্যে পার্থক্য নীচে তালিকাভুক্ত করা হয়েছে:

+---------------------------------+----------------------------------------+
| Stored Procedure (SP)           | Function (UDF - User Defined           |
|                                 | Function)                              |
+---------------------------------+----------------------------------------+
| SP can return zero , single or  | Function must return a single value    |
| multiple values.                | (which may be a scalar or a table).    |
+---------------------------------+----------------------------------------+
| We can use transaction in SP.   | We can't use transaction in UDF.       |
+---------------------------------+----------------------------------------+
| SP can have input/output        | Only input parameter.                  |
| parameter.                      |                                        |
+---------------------------------+----------------------------------------+
| We can call function from SP.   | We can't call SP from function.        |
+---------------------------------+----------------------------------------+
| We can't use SP in SELECT/      | We can use UDF in SELECT/ WHERE/       |
| WHERE/ HAVING statement.        | HAVING statement.                      |
+---------------------------------+----------------------------------------+
| We can use exception handling   | We can't use Try-Catch block in UDF.   |
| using Try-Catch block in SP.    |                                        |
+---------------------------------+----------------------------------------+

21
ফাংশনগুলির অবশ্যই একটি মান বা একটি সেট ফেরত দিতে হবে।
রাফারিনো

8
এটি 3 বছর পরে এসেছিল তবে শীর্ষে থাকা উচিত কারণ এটি পাঠযোগ্য এবং বিস্তৃত উভয়ই।
দান্তে স্মিথ

এসপি উভয় টেম্প টেবিল এবং টেবিল ভেরিয়েবল ব্যবহার করতে পারে যেখানে ইউডিএফ কেবল টেবিল ভেরিয়েবল ব্যবহার করতে পারে। পরিবর্তে সারণী ভেরিয়েবলগুলি সূচকগুলি ব্যবহার করতে পারে না। ইউপিএফকে এসপির বিপরীতে একটি ক্রস অ্যাপ্লিকেশনে কল করা যেতে পারে
লুডোভিচ অবার্ট

190

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

ফাংশনগুলির সাধারণত একটি আউটপুট থাকে এবং allyচ্ছিকভাবে ইনপুট থাকে। তারপরে আউটপুটটি অন্য ফাংশনের ইনপুট হিসাবে ব্যবহার করা যেতে পারে (একটি এসকিউএল সার্ভার অন্তর্নির্মিত যেমন ডেটডিইএফএফ, লেন, ইত্যাদি) বা এসকিউএল কোয়েরির প্রিকিকেট হিসাবে - যেমন, SELECT a, b, dbo.MyFunction(c) FROM tableবাSELECT a, b, c FROM table WHERE a = dbo.MyFunc(c)

সঞ্চিত প্রকল্পগুলি লেনদেনের জন্য এসকিউএল কোয়েরিগুলি একসাথে বাঁধতে ব্যবহার করা হয় এবং বাইরের বিশ্বের সাথে ইন্টারফেস। ADO.NET ইত্যাদির ফ্রেমওয়ার্কগুলি সরাসরি কোনও ফাংশন কল করতে পারে না, তবে তারা সরাসরি কোনও সঞ্চিত প্রকটকে কল করতে পারে।

কার্যাবলীর একটি গোপনীয় বিপদ রয়েছে যদিও: এগুলি অপব্যবহার করা যেতে পারে এবং বরং খারাপ কাজের জন্য সমস্যা তৈরি করতে পারে: এই ক্যোয়ারীটি বিবেচনা করুন:

SELECT * FROM dbo.MyTable WHERE col1 = dbo.MyFunction(col2)

যেখানে MyFunction হিসাবে ঘোষণা করা হয়েছে:

CREATE FUNCTION MyFunction (@someValue INTEGER) RETURNS INTEGER
AS
BEGIN
   DECLARE @retval INTEGER

   SELECT localValue 
      FROM dbo.localToNationalMapTable
      WHERE nationalValue = @someValue

   RETURN @retval
END

এখানে যা ঘটে তা হ'ল মাই ফাংশনটি ফাংশনটি মাই টেবিলের টেবিলের প্রতিটি সারিটির জন্য ডাকা হয়। মাই টেবিলের যদি 1000 সারি থাকে, তবে এটি ডাটাবেসের বিরুদ্ধে আরও 1000 অ্যাড-হক প্রশ্ন রয়েছে। একইভাবে, কলাম স্পেসে নির্দিষ্ট করার পরে যদি ফাংশনটি কল করা হয়, তবে ফাংশনটি নির্বাচন করে প্রতিটি সারির জন্য নির্বাচন করবে called

সুতরাং আপনার যত্ন সহকারে লেখার কাজ করা দরকার। যদি আপনি কোনও ফাংশনে কোনও টেবিল থেকে নির্বাচন করেন, আপনার নিজের জিজ্ঞাসা করা উচিত যে এটি পিতামাত্তিক স্টোরেড প্রোক বা অন্য কোনও এসকিউএল কনস্ট্রাক্ট (যেমন CASE ... যখন ... ELSE ... শেষ).


2
আপনি কি দয়া করে "ADO.NET ইত্যাদির মতো ফ্রেমওয়ার্কগুলি সরাসরি কোনও ফাংশন কল করতে পারবেন না" তে বিস্তারিত বলতে পারেন? আমি কোনও সমস্যা ছাড়াই ADO.NET ডেটা সরবরাহকারীদের সাথে ফাংশন সম্পাদন করেছি।
ইয়ান কেম্প

24
আপনাকে কিছু নির্বাচনী বিবৃতি দিয়ে একটি ফাংশন কল করতে হবে - কোনও ফাংশনকে তার নিজস্ব ডানদিকে একটি স্বাধীন টুকরো কোড হিসাবে কল করা যায় না - এটি এসকিউএল বিবৃতি ছাড়া আর কিছু না হলেও, এটি আরও কিছু বৃহত্তর এসকিউএল স্টেটমেন্টের অংশ হিসাবে ডাকা উচিত has চেয়ে SELECT * from dbo.MyTableValuedFunction()। Sprocs, otherhand উপর, সরাসরি ADO.NET সঙ্গে সেট করে বলা যেতে পারে SqlCommand.CommandTypeথেকে CommandType.StoredProcedure
ক্রিস জে

60

সঞ্চিত পদ্ধতি এবং ব্যবহারকারীর দ্বারা সংজ্ঞায়িত ফাংশনগুলির মধ্যে পার্থক্য:

  • স্টোরেজ পদ্ধতি নির্বাচনী বিবৃতিতে ব্যবহার করা যায় না।
  • সঞ্চিত পদ্ধতি স্থগিত নাম রেজোলিউশন সমর্থন করে।
  • সঞ্চিত পদ্ধতিগুলি সাধারণত ব্যবসায়িক যুক্তি সম্পাদনের জন্য ব্যবহৃত হয়।
  • সঞ্চিত পদ্ধতিগুলি কোনও ডেটাটাইপ ফিরিয়ে দিতে পারে।
  • সঞ্চিত পদ্ধতি ব্যবহারকারীর সংজ্ঞায়িত ফাংশনগুলির চেয়ে বেশি সংখ্যক ইনপুট প্যারামিটার গ্রহণ করতে পারে। সঞ্চিত পদ্ধতিতে 21,000 ইনপুট প্যারামিটার থাকতে পারে।
  • সঞ্চিত পদ্ধতিগুলি ডায়নামিক এসকিউএল কার্যকর করতে পারে।
  • সঞ্চিত পদ্ধতিগুলি ত্রুটি পরিচালনার পক্ষে সহায়তা করে।
  • সঞ্চিত পদ্ধতিতে অ-নিরস্তক ক্রিয়াকলাপ ব্যবহার করা যেতে পারে।

  • ব্যবহারকারী-সংজ্ঞায়িত ফাংশনগুলি নির্বাচনী বিবৃতিগুলিতে ব্যবহার করা যেতে পারে।
  • ব্যবহারকারী-সংজ্ঞায়িত ফাংশনগুলি স্থগিত নাম রেজোলিউশন সমর্থন করে না।
  • ব্যবহারকারী-সংজ্ঞায়িত ফাংশনগুলি সাধারণত গণনার জন্য ব্যবহৃত হয়।
  • ব্যবহারকারী-সংজ্ঞায়িত ফাংশনগুলির একটি মান ফেরত দেওয়া উচিত।
  • ব্যবহারকারী-সংজ্ঞায়িত ফাংশনগুলি চিত্রগুলি ফেরত দিতে পারে না।
  • ব্যবহারকারী-সংজ্ঞায়িত ফাংশনগুলি সঞ্চিত পদ্ধতির তুলনায় কম সংখ্যক ইনপুট পরামিতি গ্রহণ করে। ইউডিএফগুলিতে 1,023 ইনপুট প্যারামিটার থাকতে পারে।
  • অস্থায়ী টেবিলগুলি ব্যবহারকারী-সংজ্ঞায়িত কার্যগুলিতে ব্যবহার করা যায় না।
  • ব্যবহারকারী-সংজ্ঞায়িত ফাংশনগুলি ডায়নামিক এসকিউএল সম্পাদন করতে পারে না।
  • ব্যবহারকারী-সংজ্ঞায়িত ফাংশন ত্রুটি পরিচালনার পক্ষে সমর্থন করে না। RAISEERRORবা @@ERRORইউডিএফগুলিতে অনুমোদিত নয়।
  • ইউডিএফগুলিতে নন-ডিটারমিনিস্টিক ফাংশন ব্যবহার করা যায় না। উদাহরণস্বরূপ, GETDATE()ইউডিএফ ব্যবহার করা যাবে না।

1
নীচে @ কুরিয়াসবয় উদ্ধৃত করতে। অপর এক শংসাপত্রযুক্ত উত্তর (@ অংকিত দ্বারা) (<- দেখুন আমি কীভাবে এটি করেছি ?;)): "আপনার উত্সের রেফারেন্স দেওয়া উচিত ছিল This এটি ( ব্লগস.এমএসএনএন.মাইক্রোসফ্ট্র / ওয়েবসাইট / পোস্টপ্রেসভিস / ২০১৪) / 08 /… )। অন্যরা যে কাজ করে দয়া করে তাকে সম্মান করুন! "
টম

7
এই ব্লগগুলি 8 ই অক্টোবর, 2014 থেকে লেখা হয়েছিল এবং এই উত্তরটি @ মে 2, 2013 থেকে লেখা হয়েছে written
কুমার মনীষ

1
@ কোড রাইডার: আহ, আমার ক্ষমা! বিশ্বাস করতে পারছি না আমি সেটা লক্ষ্য করিনি! সুতরাং, ব্লগ ক্রেডিট ছাড়াই আপনাকে (বা অন্য কেউ করেছে) অনুলিপি করেছে?
টম

GETDATE()একটি ফাংশন ব্যবহার করা যেতে পারে। অ-প্রতিরোধক সম্পর্কিত পাইভটটি ভাল নয়।
পারফরম্যান্সডিবিএ

56

আপনি যখন অন্যান্য এসকিউএল বিবৃতিতে ব্যবহারের জন্য কোনও মান গণনা করতে এবং ফেরত দিতে চান তখন কোনও ব্যবহারকারী-সংজ্ঞায়িত ফাংশন লিখুন; আপনি পরিবর্তে চাইলে একটি সঞ্চিত পদ্ধতি লিখুন এসকিউএল বিবৃতিগুলির একটি সম্ভবত-জটিল সেটকে গোষ্ঠী করা। এগুলি দুটি ভিন্ন ভিন্ন ব্যবহারের কেস, সর্বোপরি!


18
বিভিন্ন ধরণের ব্যবহারকারী-সংজ্ঞায়িত ফাংশন রয়েছে। স্কেলারগুলি কেবল মানগুলি ফেরত দেয়; অন্যান্য ধরণের ফলাফল পুনরায় সেট করুন।
একে 15

44
              STORE PROCEDURE                 FUNCTION (USER DEFINED FUNCTION)    
 * Procedure can return 0, single or   | * Function can return only single value   
   multiple values.                    |
                                       |
 * Procedure can have input, output    | * Function  can have only input 
   parameters.                         |   parameters.         
                                       |
 * Procedure cannot be called from     | * Functions can be called from 
   function.                           |   procedure.
                                       |
 * Procedure allows select as well as  | * Function allows only select statement 
   DML statement in it.                |   in it.
                                       |
 * Exception can be handled by         | * Try-catch block cannot be used in a 
   try-catch block in a procedure.     |   function.
                                       |
 * We can go for transaction management| * We can't go for transaction 
   in procedure.                       |   management in function.
                                       |
 * Procedure cannot be utilized in a   | * Function can be embedded in a select 
   select statement                    |   statement.
                                       |
 * Procedure can affect the state      | * Function can not affect the state 
   of database means it can perform    |   of database means it can not    
   CRUD operation on database.         |   perform CRUD operation on 
                                       |   database. 
                                       |
 * Procedure can use temporary tables. | * Function can not use 
                                       |   temporary tables. 
                                       |
 * Procedure can alter the server      | * Function can not alter the  
   environment parameters.             |   environment parameters.
                                       |   
 * Procedure can use when we want      | * Function can use when we want
   instead is to group a possibly-     |   to compute and return a value
   complex set of SQL statements.      |   for use in other SQL 
                                       |   statements.

1
ইউপিএফকে এসপির বিপরীতে, একটি ক্রস অ্যাপ্লাইয়ে কল করা যেতে পারে
লুডোভিচ অবার্ট

24

বেসিক পার্থক্য

ফাংশন অবশ্যই একটি মান ফেরত দিতে পারে তবে সঞ্চিত পদ্ধতিতে এটি alচ্ছিক (পদ্ধতিটি শূন্য বা এন মানগুলি দিতে পারে)।

কার্যক্রমে এর জন্য কেবল ইনপুট প্যারামিটার থাকতে পারে তবে পদ্ধতিগুলির ইনপুট / আউটপুট পরামিতি থাকতে পারে।

ফাংশনটি একটি ইনপুট প্যারামিটার নেয় এটি বাধ্যতামূলক তবে সঞ্চিত প্রক্রিয়াটি o থেকে n ইনপুট প্যারামিটারগুলিতে নিতে পারে ..

প্রক্রিয়া থেকে ফাংশন কল করা যেতে পারে যেখানে ফাংশন থেকে পদ্ধতিগুলি কল করা যায় না।

অগ্রিম পার্থক্য

পদ্ধতিটি এতে সিলেক্টের পাশাপাশি ডিএমএল (INSERT / UPDATE / DELETE) স্টেটমেন্টের অনুমতি দেয় যেখানে ফাংশন এতে কেবল নির্বাচন বাছাইয়ের অনুমতি দেয়।

পদ্ধতিগুলি একটি নির্বাচনী বিবৃতিতে ব্যবহার করা যাবে না যেখানে ফাংশনটি একটি নির্বাচনী বিবৃতিতে এম্বেড করা যেতে পারে।

সঞ্চিত পদ্ধতিগুলি যেখানে এসকিউএল স্টেটমেন্টে যেখানেই / যেখানে / নির্বাচিত অংশে ফাংশন হতে পারে সেগুলিতে ব্যবহার করা যাবে না।

ফাংশনগুলি যা টেবিলগুলি ফেরত দেয় তাকে অন্য একটি রোসেট হিসাবে বিবেচনা করা যেতে পারে। এটি অন্যান্য টেবিলের সাথে জোয়িনগুলিতে ব্যবহার করা যেতে পারে।

ইনলাইন ফাংশন এমন মতামত হতে পারে যা পরামিতি নেয় এবং জওআইএন এবং অন্যান্য রাউসেট ক্রিয়াকলাপে ব্যবহার করা যেতে পারে।

কোনও পদ্ধতিতে ট্রাই-ক্যাচ ব্লক দ্বারা ব্যতিক্রম হ্যান্ডেল করা যায় তবে ফাংশনে ট্রাই-ক্যাচ ব্লক ব্যবহার করা যায় না।

আমরা কার্যক্রমে লেনদেন পরিচালনার জন্য যেতে পারি যেখানে আমরা ফাংশনে যেতে পারি না।

সূত্র


25
আপনার উত্স রেফারেন্স দেওয়া উচিত ছিল। এটি ডটনেট-ট্রিক্সস / টিউটোরিয়াল / এসকিউলসার্ভার/ … থেকে । অন্যরা যে কাজ করে দয়া করে সম্মান করুন!
কৌতূহলবয়

16
কোনও উত্স রেফারেন্স না দেওয়ার কারণ নয়। আপনি এর শেষে উল্লেখ করতে পারেন!
কৌতূহলবয়

2
করছেন। "ফাংশনটি অবশ্যই একটি মান ফেরত দেয় তবে সঞ্চিত পদ্ধতিতে এটি alচ্ছিক ....": আমি স্পষ্ট করে বলব: "ফাংশনগুলির একটি এবং একটি মাত্র মান অবশ্যই ফেরত দিতে হবে (যা Returnsমূলশব্দের মাধ্যমে করা আবশ্যক এবং অবশ্যই অবশ্যই স্কেলার বা টেবিলের ধরণের হতে হবে) , তবে সঞ্চিত পদ্ধতিগুলি বিকল্পভাবে ফিরে আসতে পারে: ক) বিবৃতি দিয়ে 1 Intধরণের ফলাফলের কোড Returnএবং / অথবা খ) 1+ প্যারামিটারগুলি (সহ Cursorপ্রকার) Outputকীওয়ার্ডের মাধ্যমে এবং / অথবা গ) বিবরণীর মাধ্যমে 1+ সারি সেট Select। যদি কেবল 1 সারি সেট থাকে ফিরে আসে, এটি "sertোকান "োকান" বিবৃতিটির "এক্সিকিউট_ স্টেটমেন্ট" যুক্তি হিসাবে ব্যবহার করা যেতে পারে।
টম

20

একটি ব্যবহারকারী সংজ্ঞায়িত ফাংশন একটি স্কেল সার্ভার প্রোগ্রামারকে উপলব্ধ একটি গুরুত্বপূর্ণ সরঞ্জাম। আপনি এটির মতো এসকিউএল বিবৃতিতে এটি ইনলাইন ব্যবহার করতে পারেন

SELECT a, lookupValue(b), c FROM customers 

যেখানে lookupValueএকটি ইউডিএফ হবে। সঞ্চিত পদ্ধতি ব্যবহার করার সময় এই জাতীয় কার্যকারিতা সম্ভব হয় না। একই সাথে আপনি কোনও ইউডিএফের ভিতরে নির্দিষ্ট কিছু করতে পারবেন না। এখানে মনে রাখার মূল বিষয়টি হ'ল ইউডিএফ এর:

  • স্থায়ী পরিবর্তন তৈরি করতে পারে না
  • ডেটা পরিবর্তন করতে পারবেন না

একটি সঞ্চিত পদ্ধতি এই জিনিসগুলি করতে পারে।

আমার জন্য কোনও ইউডিএফের ইনলাইন ব্যবহার হ'ল একটি ইউডিএফের সর্বাধিক গুরুত্বপূর্ণ ব্যবহার।


14

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

ফাংশনগুলি পদ্ধতি হিসাবে ব্যবহৃত হয়। আপনি এটি কিছু পাস এবং এটি একটি ফলাফল ফিরে। ছোট এবং দ্রুত হওয়া উচিত - এটি উড়ে যায়। সাধারণত একটি নির্বাচনী বিবৃতিতে ব্যবহৃত হয়।


2
এটি তাদের দুটি ভাবার জন্য দ্রুত এবং নোংরা উপায়গুলির একটি ভাল সংক্ষিপ্তসার।
এরিক বিশার্ড

2
প্রকৃতপক্ষে একটি ভাল সংক্ষিপ্তসার। অন্যান্য উত্তরগুলি উভয়ের তাত্ত্বিক পার্থক্যের উপর দৃষ্টি নিবদ্ধ করে, যখন এখনও অনুশীলনে কোনটি ব্যবহার করতে হবে তা সম্পর্কে আমাকে এখনও অনিশ্চিত রেখে গেছেন।
jf328

8

সংরক্ষিত নীতিমালা:

  • এসকিউএল সার্ভারে একটি ক্ষুদ্রাকার প্রোগ্রামের মতো।
  • একটি নির্বাচিত বিবৃতি হিসাবে সহজ হতে পারে, বা একটি দীর্ঘ স্ক্রিপ্ট হিসাবে জটিল যা একটি ডাটাবেসে একাধিক টেবিল থেকে ডেটা যোগ, মুছতে, আপডেট করতে এবং / অথবা পড়তে পারে।
  • (লুপ এবং কার্সারগুলি প্রয়োগ করতে পারে, যা উভয়ই আপনাকে ছোট ফলাফলের সাথে কাজ করতে বা ডাটাতে সারি ক্রিয়াকলাপের সাহায্য করে))
  • ব্যবহার করে EXECবা বলা উচিতEXECUTE বিবৃতি ।
  • সারণী ভেরিয়েবলগুলি ফিরিয়ে দেয়, তবে আমরা ব্যবহার করতে পারি না OUT প্যারামিটার ।
  • লেনদেন সমর্থন করে।

ফাংশন:

  • আপডেট করতে, মুছতে বা ডাটাবেসে রেকর্ড যুক্ত করতে ব্যবহার করা যাবে না।
  • কেবলমাত্র একটি একক মান বা একটি সারণী মান প্রদান করে।
  • কেবল রেকর্ড নির্বাচন করতে ব্যবহার করা যেতে পারে। তবে এটি স্ট্যান্ডার্ড এসকিউএল থেকে খুব সহজেই বলা যেতে পারে যেমন:

    SELECT dbo.functionname('Parameter1')

    অথবা

    SELECT Name, dbo.Functionname('Parameter1') FROM sysObjects
  • সাধারণ পুনরায় ব্যবহারযোগ্য নির্বাচন অপারেশনগুলির জন্য, ফাংশনগুলি কোড সহজতর করতে পারে। JOINআপনার ফাংশনগুলিতে ক্লজগুলি ব্যবহার করার বিষয়ে কেবল সতর্ক থাকুন । যদি আপনার ফাংশনটিতে একটি JOINধারা রয়েছে এবং আপনি এটি অন্য একটি নির্বাচিত বিবৃতি থেকে কল করেছেন যা একাধিক ফলাফল প্রত্যাবর্তন করে, সেই ফাংশন কলটিতে প্রতিটি লাইনের JOIN জন্য এই টেবিলগুলি একত্রে ফলাফল সেটে ফিরে আসবে। সুতরাং যদিও তারা কিছু যুক্তি সহজ করার ক্ষেত্রে সহায়ক হতে পারে তবে তারা যদি সঠিকভাবে ব্যবহার না করা হয় তবে তারা পারফরম্যান্সের বাধাও হতে পারে।

  • OUTপ্যারামিটার ব্যবহার করে মানগুলি প্রদান করে ।
  • লেনদেন সমর্থন করে না।

8

ব্যবহারকারী সংজ্ঞায়িত ফাংশন।

  1. ফাংশন অবশ্যই একটি মান ফেরত দেয়।
  2. কেবলমাত্র নির্বাচনী বিবৃতিগুলিকে অনুমতি দেবে, এটি আমাদের ডিএমএল স্টেটমেন্টগুলি ব্যবহার করতে দেয় না।
  3. এটি কেবল ইনপুট পরামিতিগুলিকে অনুমতি দেবে, আউটপুট প্যারামিটারগুলিকে সমর্থন করে না।
  4. এটি আমাদের চেষ্টা-ব্লক ব্যবহার করতে দেয় না।
  5. কার্যের মধ্যে লেনদেনের অনুমতি নেই।
  6. আমরা কেবল টেবিলের ভেরিয়েবল ব্যবহার করতে পারি, এটি অস্থায়ী টেবিলগুলি ব্যবহারের অনুমতি দেয় না।
  7. সঞ্চিত পদ্ধতিগুলি কোনও ফাংশন থেকে কল করা যায় না।
  8. একটি নির্বাচিত বিবৃতি থেকে ফাংশন কল করা যেতে পারে।
  9. একটি ইউডিএফ ফলাফল সেট হিসাবে যোগদানের ধারাটিতে ব্যবহার করা যেতে পারে।

সংরক্ষিত নীতিমালা

  1. সঞ্চিত পদ্ধতিটি মানগুলি ফেরত দিতে পারে না।
  2. নির্বাচনী বিবৃতিগুলির পাশাপাশি ডিএমএল স্টেটমেন্ট যেমন সন্নিবেশ, আপডেট, মুছুন ইত্যাদি থাকতে পারে
  3. এটিতে ইনপুট এবং আউটপুট উভয় পরামিতি থাকতে পারে।
  4. ব্যতিক্রম হ্যান্ডলিংয়ের জন্য আমরা ক্রিচ ব্লকগুলি ব্যবহার করতে পারি।
  5. সঞ্চিত পদ্ধতিতে লেনদেন ব্যবহার করতে পারেন।
  6. উভয় টেবিল ভেরিয়েবল পাশাপাশি এতে অস্থায়ী টেবিল ব্যবহার করতে পারে।
  7. সঞ্চিত পদ্ধতিগুলি ফাংশনগুলিতে কল করতে পারে।
  8. নির্বাচন / যেখানে / থাকা এবং বিবৃতিতে ইত্যাদি থেকে প্রক্রিয়াগুলি কল করা যায় না। সঞ্চালিত / কার্যনির্বাহী বিবৃতি স্টোরেজ পদ্ধতি কল / সম্পাদন করতে ব্যবহৃত হতে পারে।
  9. যোগদানের ধারাটিতে প্রক্রিয়াগুলি ব্যবহার করা যাবে না

6

নিম্নলিখিত পয়েন্টগুলি কী সাহায্য করতে পারে সে সম্পর্কে সিদ্ধান্ত নেওয়ার জন্য-

  1. সঞ্চিত পদ্ধতিগুলি কোনও টেবিল ভেরিয়েবলটি ফিরিয়ে দিতে পারে না যেখানে ফাংশন হিসাবে এটি করতে পারে।

  2. আপনি সার্ভার পরিবেশের পরামিতিগুলিকে পরিবর্তন করতে সঞ্চিত পদ্ধতি ব্যবহার করতে পারেন যেখানে আপনি করতে পারেন না এমন ফাংশনগুলি ব্যবহার করে।

চিয়ার্স


6

এসকিউএল সার্ভার ফাংশন, যেমন কার্সারগুলি, বোঝানো হচ্ছে আপনার শেষ অস্ত্র হিসাবে ব্যবহৃত হবে! তাদের পারফরম্যান্স সংক্রান্ত সমস্যা রয়েছে এবং তাই সারণী-মূল্যবান ফাংশনটি ব্যবহার করা যতটা সম্ভব এড়ানো উচিত। পারফরম্যান্স সম্পর্কে কথা বলতে একটি মধ্যবিত্ত হার্ডওয়্যারে একটি সার্ভারে হোস্ট করা 1,000,000 রেকর্ড সহ একটি টেবিলের কথা বলা হয়; অন্যথায় আপনাকে কার্যকারিতা দ্বারা সৃষ্ট পারফরম্যান্স হিট সম্পর্কে চিন্তা করার দরকার নেই।

  1. কোনও বাহ্যিক কোডে ফলাফল-সেটটি ফেরত দিতে কোনও ফাংশন কখনও ব্যবহার করবেন না (যেমন ADO.Net)
  2. যতটা সম্ভব ভিউ / সঞ্চিত প্রোকস সংমিশ্রণটি ব্যবহার করুন। আপনি ডিটিএ (ডেটাবেস টিউনিং অ্যাডভাইজার) পরামর্শটি ব্যবহার করে ভবিষ্যতের বৃদ্ধি-পারফরম্যান্স সংক্রান্ত সমস্যাগুলি থেকে পুনরুদ্ধার করতে পারেন - কিছু সময়!

আরও রেফারেন্স দেখুন: http://databases.aspfaq.com/database/should-i-use-a-view-a-stored-procedure-or-a-user-defined-function.html


1
ধন্যবাদ। একটি কলামের জন্য মানগুলি পপুলেট করার জন্য ক্যোয়ারির মধ্যে কল করতে আজ একটি ফাংশন লিখেছেন। আমি এটি বন্ধ করার আগে 3 মিনিটেরও বেশি সময় ধরে চালানো চালান। এটি করার জন্য একটি JOIN উপায় খুঁজে পেয়েছি। সম্পাদনা 15 সেকেন্ডের মধ্যে শেষ হয়েছে। (ডেটা সেটটি 3456 সারি ছিল)। বড় পারফরম্যান্স ভিন্ন।
ভিআইএসকিউএল

সম্পাদনা করুন: আমি "অর্ডার বাই" (ডেটা সেটটি 3456 সারি ছিল) উপর নির্ভর করে 15 এবং 50 সেকেন্ডের মধ্যে শেষ সম্পাদন করুন। বড় পারফরম্যান্স পার্থক্য।
ভিআইএসকিউএল

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

1
আমি নিশ্চিত নই যে এটি শেষ বিকল্প হওয়া উচিত বলে যথেষ্ট প্রমাণ সরবরাহ করা হয়েছে। আপনি কোনও ফাংশনটিকে প্যারামিটারাইজড ভিউ হিসাবে ভাবতে পারেন যা আরও চালিত হতে পারে। উদাহরণস্বরূপ, আপনি গ্রাহকদের অর্ডার করতে যোগ দিতে চান, তবে কেবল মিশিগানের জন্য। আপনি একটি গ্রাহক অর্ডার (@ স্টেটকোড) ফাংশন তৈরি করেন যা কেবলমাত্র একক রাষ্ট্রের গ্রাহকের মূল্য হিসাবে যোগদান করবে। তারপরে, আমি এই সেটটিতে আরও আগে নির্বাচন করবো ফার্স্টনেম, লাস্টনেম, অর্ডারটোটাল, স্টোরনেম থেকে কাস্টমার অর্ডারস ('এমআই') থেকে অন্তর্ভুক্ত স্টোরগুলিতে স্টোরআইড = অর্ডার.স্টোরাইড যেখানে অর্ডারটোটাল> 100; আপনার এসএমএসের অনুলিপি করার কারণে এটি এসপিদের জন্য ব্যথা হতে পারে।
এমপাব্লাক

সেই টেবিলে আপনার কতটি রেকর্ড রয়েছে? যদি আপনার হার্ডওয়্যার এটি সঠিকভাবে পরিচালনা করে তবে আপনার অস্ত্র বেছে নেওয়ার বিষয়ে চিন্তা করার দরকার নেই। একটি চামচ কাজ করতে পারে যখন তরোয়াল ভাঙ্গার পক্ষে যথেষ্ট কঠিন; এই কঠোরতা বলা হয় হার্ডওয়ার!
অ্যাকিলিস

3

একক মান ফেরত দেয় এমন ফাংশন দিয়ে শুরু করুন। সুন্দর জিনিস হ'ল আপনি ঘন ঘন ব্যবহৃত কোড কোনও ফাংশনে রেখে দিতে পারেন এবং ফলস্বরূপ সেটে কলাম হিসাবে তাদের ফিরিয়ে দিতে পারেন।

তারপরে, আপনি শহরগুলির প্যারামিটারাইজড তালিকার জন্য কোনও ফাংশন ব্যবহার করতে পারেন। dbo.GetCitiesIn ("NY") এটি একটি সারণী প্রদান করে যা যোগদান হিসাবে ব্যবহৃত হতে পারে।

এটি কোড সংগঠিত করার একটি উপায়। কখন কখন পুনর্ব্যবহারযোগ্য এবং কখন সময় অপচয় হয় তা জেনে রাখা কেবলমাত্র পরীক্ষা এবং ত্রুটি এবং অভিজ্ঞতার মাধ্যমেই অর্জন করা।

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


3

সঞ্চিত পদ্ধতির চেয়ে ফাংশন পছন্দ করার জন্য এখানে একটি ব্যবহারিক কারণ। আপনার যদি এমন কোনও সঞ্চিত প্রক্রিয়া থাকে যা অন্য সঞ্চিত পদ্ধতির ফলাফলের প্রয়োজন হয় তবে আপনাকে একটি সন্নিবেশ-এক্সিকিউট স্টেটমেন্ট ব্যবহার করতে হবে। এর অর্থ এই যে আপনাকে একটি টেম্প টেবিল তৈরি করতে হবে এবং টেম্প টেবিলের execমধ্যে সঞ্চিত পদ্ধতির ফলাফলগুলি সন্নিবেশ করতে একটি বিবৃতি ব্যবহার করতে হবে। এটা অগোছালো। এর সাথে একটি সমস্যা হ'ল সন্নিবেশ-এক্সেকসগুলি নেস্ট করা যায় না

আপনি যদি সঞ্চিত পদ্ধতিতে আটকে থাকেন যা অন্যান্য সঞ্চিত প্রক্রিয়াগুলি কল করে, আপনি এটির মধ্যে চলে যেতে পারেন। যদি নেস্টেড সঞ্চিত পদ্ধতিটি কেবল একটি ডেটাসেট ফেরত দেয় তবে এটি একটি টেবিল-মূল্যবান ফাংশন দিয়ে প্রতিস্থাপন করা যেতে পারে এবং আপনি আর এই ত্রুটিটি পাবেন না।

( এটি আমাদের ব্যবসায়ের যুক্তিটি ডাটাবেস থেকে দূরে রাখার আরও একটি কারণ )


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

1
  • কার্যকারিতা একটি নির্বাচনী বিবৃতিতে ব্যবহার করা যেতে পারে যেখানে পদ্ধতিগুলি পারে না।

  • সঞ্চিত পদ্ধতিতে ইনপুট এবং আউটপুট উভয় পরামিতি লাগে তবে ফাংশনগুলি কেবল ইনপুট পরামিতি নেয়।

  • কার্যপ্রণালী যেখানে পাঠ্য, নেক্সট, চিত্র এবং টাইমস্ট্যাম্পগুলির মানগুলি ফিরে আসতে পারে না যেখানে পদ্ধতিগুলি পারে।

  • সারণী তৈরিতে ফাংশনগুলি ব্যবহারকারী সংজ্ঞায়িত ডেটাটাইপ হিসাবে ব্যবহার করা যেতে পারে তবে পদ্ধতিগুলি তা করতে পারে না।

*** যেমন: -create table <tablename>(name varchar(10),salary getsal(name))

এখানে গেসাল একটি ব্যবহারকারী সংজ্ঞায়িত ফাংশন যা বেতনের ধরণটি প্রদান করে, যখন টেবিল তৈরি হয় তখন বেতন ধরণের জন্য কোনও স্টোরেজ বরাদ্দ করা হয় না, এবং গেসাল ফাংশনটিও কার্যকর হয় না, তবে যখন আমরা এই টেবিলটি থেকে কিছু মান আনছি, গেসাল ফাংশনটি কার্যকর হবে এবং রিটার্ন টাইপ ফলাফল ফলাফল হিসাবে ফিরে আসে।


1

আমি বুঝতে পারি এটি একটি অতি পুরনো প্রশ্ন, তবে আমি উত্তরের কোনওটিতে উল্লেখ করা একটি গুরুত্বপূর্ণ দিক দেখতে পাচ্ছি না: ক্যোয়ারী পরিকল্পনায় অন্তর্ভুক্ত।

কার্যাবলী হতে পারে ...

  1. স্কালে:

    CREATE FUNCTION ... RETURNS scalar_type AS BEGIN ... END

  2. একাধিক বিবৃতি সারণী মূল্যবান:

    CREATE FUNCTION ... RETURNS @r TABLE(...) AS BEGIN ... END

  3. ইনলাইন টেবিলের মূল্যবান:

    CREATE FUNCTION ... RETURNS TABLE AS RETURN SELECT ...

তৃতীয় ধরণের (ইনলাইন টেবিলের মূল্যবান) কোয়েরি অপ্টিমাইজার দ্বারা মূলত (প্যারাম্যাট্রাইজড) মতামত হিসাবে বিবেচিত হয়, যার অর্থ আপনার ক্যোয়ারী থেকে ফাংশনটি উল্লেখ করা ফাংশনের এসকিউএল বডিটিকে (অনুলিপি করে অনুলিপি-পেস্ট করা ছাড়া) অনুলিপি করার অনুরূপ, শীর্ষস্থানীয় নিম্নলিখিত সুবিধা:

  • ক্যোয়ারী পরিকল্পনাকারী ইনলাইন ফাংশনটির কার্যকারিতা যেমন অনুকূলভাবে কার্যকর করতে পারে ঠিক তেমন কোনও উপ-কোয়েরি যেমন (যেমন অব্যক্ত কলামগুলি মুছে ফেলুন, পূর্বাভাসগুলি নীচে ধাক্কা দিন, বিভিন্ন JOIN কৌশল বেছে নিন) etc.
  • বেশ কয়েকটি ইনলাইন ফাংশন সংমিশ্রণ করতে অন্যটিকে খাওয়ানোর আগে প্রথমটি থেকে ফলাফলটি বাস্তবায়নের প্রয়োজন হয় না।

উপরের ফলে সম্ভাব্য তাৎপর্যপূর্ণ পারফরম্যান্সের সঞ্চয় হতে পারে, বিশেষত যখন একাধিক স্তরের ফাংশন সংমিশ্রিত করা হয়।


দ্রষ্টব্য: এসকিউএল সার্ভার 2019 এর মতো মনে হচ্ছে স্কেলার ফাংশনটি ইনলাইনিংয়ের কিছু ফর্মও প্রবর্তন করবে ।


-2

এসকিউএল সার্ভারে, ফাংশন এবং সঞ্চিত পদ্ধতি দুটি পৃথক পৃথক সত্তা।

ফাংশন: এসকিউএল সার্ভার ডাটাবেসে, ফাংশনগুলি কিছু ক্রিয়া সম্পাদন করতে ব্যবহৃত হয় এবং ক্রিয়াটি তত্ক্ষণাত ফল দেয়। ফাংশন দুটি ধরণের:

  1. সিস্টেম সংজ্ঞায়িত

  2. ব্যবহারকারী সংজ্ঞায়িত

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

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