সম্ভবত সম্ভবত প্রাথমিক কারণটি হ'ল টেবিল-মূল্যবান ফাংশনগুলি সারণী এবং দর্শনগুলির মতো ফলাফল সেটটি ফেরত দেয়। এর অর্থ এই যে তারা ব্যবহার করা যেতে পারে FROMদফা (তত্সহ JOINs এবং APPLYএর গুলি, ইত্যাদি) SELECT, UPDATEএবং DELETEপ্রশ্নের। আপনি তবে এই প্রসঙ্গে যে কোনও একটিতে স্কেলার ইউডিএফ ব্যবহার করতে পারবেন না।
দ্বিতীয়ত, আপনি EXECUTEএকটি স্কেলার ইউডিএফও করতে পারেন । আপনি যখন ইনপুট পরামিতিগুলির জন্য নির্দিষ্ট মান নির্ধারণ করেন তখন এই বাক্য গঠনটি বেশ কার্যকর। নিম্নলিখিত ইউডিএফ নিন, উদাহরণস্বরূপ:
CREATE FUNCTION dbo.OptionalParameterTest (@Param1 INT = 1, @Param2 INT = 2)
RETURNS INT
AS
BEGIN
RETURN @Param1 + @Param2;
END;
আপনি যদি কোনও ইনপুট প্যারামিটারগুলিকে "alচ্ছিক" হিসাবে বিবেচনা করতে চান DEFAULTতবে স্বাক্ষরটি স্থির হওয়ার পরে আপনার কীওয়ার্ডটি কোনও ফাংশনের মতো ডাকার সময় পাস করতে হবে :
DECLARE @Bob1 INT;
SET @Bob1 = dbo.OptionalParameterTest(100, DEFAULT);
SELECT @Bob1;
-- Returns: 102
অন্যদিকে, আপনি যদি EXECUTEফাংশন করেন তবে আপনি কোনও সঞ্চিত পদ্ধতি ব্যবহারের মতো ডিফল্ট মান সহ যে কোনও প্যারামিটারকে সত্যই optionচ্ছিক হিসাবে বিবেচনা করতে পারবেন। প্যারামিটারের নাম উল্লেখ না করে আপনি প্রথম এন প্যারামিটারগুলিতে পাস করতে পারেন :
DECLARE @Bob2 INT;
EXEC @Bob2 = dbo.OptionalParameterTest 50;
SELECT @Bob2;
-- Returns: 52
এমনকি আপনি সঞ্চিত প্রক্রিয়াগুলির মতো প্যারামিটারের নামগুলি উল্লেখ করে প্রথম প্যারামিটারটি এড়িয়ে যেতে পারেন:
DECLARE @Bob3 INT;
EXEC @Bob3 = dbo.OptionalParameterTest @Param2 = 50;
SELECT @Bob3;
-- Returns: 51
হালনাগাদ
আপনি কেন EXECএকটি স্টোরড পদ্ধতির মতো একটি স্কেলার ইউডিএফ কল করতে সিনট্যাক্সটি ব্যবহার করতে চাইতে পারেন ? মাঝেমধ্যে ইউডিএফ রয়েছে যা ইউডিএফ হিসাবে থাকতে পারে যেহেতু এগুলিকে কোনও ক্যোয়ারিতে যুক্ত করা যায় এবং ফিরে আসা সারিগুলির সেট পরিচালনা করতে পারে, অন্যদিকে যদি কোডটি একটি সঞ্চিত পদ্ধতিতে থাকে তবে এটির জন্য কার্সারে রাখার প্রয়োজন হবে সারিগুলির একটি সেট জুড়ে পুনরাবৃত্তি করুন। তবে তারপরে এমন সময় আছে যে আপনি সেই ফাংশনটিকে একটি মানতে কল করতে চান, সম্ভবত অন্য কোনও ইউডিএফের মধ্যে থেকে। একটি একক মানের জন্য একটি ইউডিএফ কল করা হিসাবে করা যেতে পারে:
SELECT dbo.UDF('some value');
সেক্ষেত্রে আপনি একটি ফলাফল সেটে একটি রিটার্ন মান পান (ফলাফল সেটটি কাজ করবে না)। অথবা এটি নিম্নলিখিত হিসাবে করা যেতে পারে:
DECLARE @Dummy INT;
SET @Dummy = dbo.UDF('some value');
এই ক্ষেত্রে আপনাকে @Dummyভেরিয়েবল ঘোষণা করতে হবে ;
যাইহোক, EXECসিনট্যাক্স সহ, আপনি both উভয় বিরক্তি এড়াতে পারেন:
EXEC dbo.UDF 'some value';
ALSO, স্কেলার ইউডিএফগুলির মৃত্যুদণ্ড কার্যকর করার পরিকল্পনাগুলি ক্যাশেড রয়েছে। এর অর্থ হ'ল ইউডিএফ-এ কার্যকর করার পরিকল্পনা রয়েছে এমন প্রশ্নগুলি থাকলে প্যারামিটার স্নিফিংয়ের সমস্যাগুলিতে চালানো সম্ভব। EXECসিন্টেক্সগুলি যেখানে সিনট্যাক্সটি ব্যবহার করা সম্ভব হবে, তারপরে সেই নির্বাহের জন্যWITH RECOMPILE সংকলিত পরিকল্পনাগুলি উপেক্ষা করার বিকল্পটিও ব্যবহার করা সম্ভব । উদাহরণ স্বরূপ:
সেটআপ:
GO
CREATE FUNCTION dbo.TestUDF (@Something INT)
RETURNS INT
AS
BEGIN
DECLARE @Ret INT;
SELECT @Ret = COUNT(*)
FROM sys.indexes si
WHERE si.[index_id] = @Something;
RETURN @Ret;
END;
GO
পরীক্ষা:
DECLARE @Val INT;
SET @Val = dbo.TestUDF(1);
SELECT @Val;
EXEC @Val = dbo.TestUDF 0 -- uses compiled value of (1)
SELECT @Val;
EXEC @Val = dbo.TestUDF 0 WITH RECOMPILE; -- uses compiled value of (0)
SELECT @Val;
EXEC @Val = dbo.TestUDF 3 -- uses compiled value of (1)
SELECT @Val;