مقایسه Scalar Valued و Table Valued در SQL
در دیتابیس فانکشنهای موجود به 2 صورت Scalar و Table-Value هستند که در این مطلب تفاوت آنها را بیان میکنیم.
Scalar Function
:
که به آن User Defined Functions
یا UDFS
نیز میگویند، فقط یک خروجی دارد و خروجی آن result set
نیست.
پس برای مقداردهی به آن میتوان از SET
استفاده کرد.
همچنین برای فراخوانی آن شبیه به Stored Procedures میتوان از EXEC
استفاده کرد.
ورودی این فانکشنها میتواند یک یا بیشتر باشد اما خروجی آنها همیشه یکی است.
این نوع فانکشن نمیتواند دیتا را آپدیت کند و فقط قابلیت دستیابی به دیتا را دارد که البته خواندن دیتا در این نوع فانکشن نیز Good Practice نیست.
این فانکشن قابلیت فراخوانی در ورودی دیگر فانکشنها را نیز دارد.
برای ساخت این نوع فانکشن میتوانید بصورت زیر عمل کنید:
CREATE FUNCTION [schema_name.]function_name (parameter_list)
RETURNS data_type AS
BEGIN
statements
RETURN value
END
بطور مثال فانکشن زیر متغیر ورودی را در 2 ضرب میکند و آن را برمیگرداند
CREATE FUNCTION dbo.Test(
@quantity INT,
)
RETURNS INT
AS
BEGIN
RETURN @quantity * 2;
END;
فانکشنهای ساخته شده در آدرس Programmability > Functions > Scalar-valued Functions
ذخیره میشوند.
روش فراخوانی آنها نیز میتواند بصورت زیر باشد:
SELECT
dbo.Test(10) my;
لیست توابع از خود SQL که از این نوع هستند را میتوانید در لینک زیر مشاهده کنید:
Categories of scalar functions
Table-Valued Functions
که به آن TVFs
نیز میگویند، دارای خروجی از نوع result sets
است و میتواند در FROM, JOIN, CROSS APPLY استفاده شود.
اما قابلیت استفاده در INSERT, UPDATE, DELETE را ندارد.
User-Defined Aggregates
که به آن UDA
نیز میگویند، برای استفاده حتما نیاز به GROUP BY
دارند.
مانند توابع SUM, MIN, COUNT
ورودی آن مجموعهای از دادهها است و فقط یک خروجی برمیگرداند.
از آنها میتوان در بخش SELECT و HAVING یک کوئری استفاده کرد.
خروجی آن از نوع deterministic
است، به این معنی که به ازای ورودی یکسان، همیشه خروجی یکسان میدهد.
Deterministic and Nondeterministic Functions
لیست توابع از خود SQL که از این نوع هستند را میتوانید در لینک زیر مشاهده کنید:
Analytic functions
شبیه به حالت Aggregate functions
است اما خروجی آن به ازای هر GROUP میتواند چندین سطر است.
مانند توابع LAG
و PERCENTILE_DISC