تابعها (FUNCTION) در SQL Server
توابع SQL Server کدهای قابل استفاده مجدد هستند که مقدار بازگشتی دارند و برای محاسبات یا پردازش دادهها استفاده میشوند.
تابعها (FUNCTION) در SQL Server
توابع (Functions) در SQL Server قطعه کدی هستند که مقدار مشخصی را برمیگردانند و میتوانند در کوئریها، شرطها و عملیات محاسباتی استفاده شوند.
این توابع قابلیت دریافت پارامتر دارند و در نهایت یک خروجی واحد یا مجموعهای از دادهها را برمیگردانند.
استفاده از توابع باعث افزایش خوانایی، کاهش کدنویسی تکراری و بهبود ساختار پایگاه داده میشود.
در SQL Server توابع به چند دسته تقسیم میشوند: توابع اسکالر (Scalar Functions) که یک مقدار منفرد برمیگردانند، توابع تجمعی (Aggregate Functions) مانند SUM و AVG که روی مجموعهای از رکوردها کار میکنند، توابع جدولی (Table-Valued Functions) که یک جدول به عنوان خروجی برمیگردانند و همچنین توابع سیستمی (System Functions) که توسط SQL Server برای عملیاتهای داخلی فراهم شدهاند.
انتخاب نوع تابع مناسب، نقش مهمی در بهینهسازی کوئریها و سرعت اجرای آنها دارد.
کاربردهای متداول توابع در SQL
- استانداردسازی دادهها (مثل حذف فاصلههای اضافی یا فرمتکردن شماره تلفن).
- محاسبه مقادیر مالی یا آماری که در گزارشها تکرار میشوند.
- تجزیه رشتهها یا عملیات متنی پیچیده.
- ساخت مجموعه دادههای پارامتری مشابه View.
انواع تابعها در SQL
SQL Server سه نوع تابع کاربرساز دارد:
-
Scalar-valued Function (اسکالر)
خروجی فقط یک مقدار تکی است، مثل عدد یا رشته. -
Inline Table-Valued Function (iTVF)
خروجی یک کوئری تکعبارتی است که مانند یک جدول عمل میکند. کارایی بالایی دارد چون بهینهساز میتواند آن را در کوئری اصلی inline کند. -
Multi-statement Table-Valued Function (mTVF)
خروجی یک متغیر جدولی است که در بدنهٔ تابع با چند دستور پر میشود. انعطافپذیر اما اغلب کندتر از iTVF.
ایجاد تابع در SQL
-
تابع اسکالر ساده
CREATE FUNCTION dbo.fn_CalcNetPrice
(
@GrossPrice DECIMAL(18,2),
@TaxRate DECIMAL(5,2)
)
RETURNS DECIMAL(18,2)
AS
BEGIN
RETURN @GrossPrice * (1 - @TaxRate/100.0);
END;
GO
استفاده:
SELECT ProductID,
ListPrice,
dbo.fn_CalcNetPrice(ListPrice, 9) AS NetPrice
FROM Products;
-
اسکالر با کنترل NULL
CREATE FUNCTION dbo.fn_SafeDivide(@a DECIMAL(18,4), @b DECIMAL(18,4))
RETURNS DECIMAL(18,4)
AS
BEGIN
RETURN CASE WHEN @b IS NULL OR @b=0 THEN NULL ELSE @a/@b END;
END;
GO
-
Inline Table-Valued Function
CREATE FUNCTION dbo.fn_GetOrdersByCustomer
(
@CustomerID INT,
@FromDate DATE = NULL,
@ToDate DATE = NULL
)
RETURNS TABLE
AS
RETURN
(
SELECT o.OrderID, o.OrderDate,
SUM(oi.UnitPrice * oi.Quantity) AS Total
FROM Orders o
JOIN OrderItems oi ON o.OrderID = oi.OrderID
WHERE o.CustomerID=@CustomerID
AND (@FromDate IS NULL OR o.OrderDate>=@FromDate)
AND (@ToDate IS NULL OR o.OrderDate<=@ToDate)
GROUP BY o.OrderID, o.OrderDate
);
GO
-
Multi-statement TVF (مثال تقسیم رشته)
CREATE FUNCTION dbo.fn_SplitString(@input NVARCHAR(MAX), @sep NCHAR(1))
RETURNS @Tokens TABLE(Token NVARCHAR(100))
AS
BEGIN
DECLARE @pos INT=1, @next INT;
WHILE 1=1
BEGIN
SET @next=CHARINDEX(@sep,@input,@pos);
IF @next=0
BEGIN
INSERT INTO @Tokens VALUES(SUBSTRING(@input,@pos,LEN(@input)-@pos+1));
BREAK;
END
INSERT INTO @Tokens VALUES(SUBSTRING(@input,@pos,@next-@pos));
SET @pos=@next+1;
END
RETURN;
END;
GO
استفاده:
SELECT * FROM dbo.fn_SplitString('ali,reza,sara',',');
تغییر تابع (ALTER FUNCTION)
برای اصلاح منطق:
ALTER FUNCTION dbo.fn_CalcNetPrice(...)
RETURNS DECIMAL(18,2)
AS
BEGIN
RETURN @GrossPrice - (@GrossPrice*@TaxRate/100.0);
END;
GO
حذف تابع در SQL
-
دستور ساده
DROP FUNCTION dbo.fn_CalcNetPrice;
GO
-
حذف امن با IF EXISTS
DROP FUNCTION IF EXISTS dbo.fn_CalcNetPrice;
GO
-
حذف چند تابع همزمان
DROP FUNCTION IF EXISTS dbo.fn_CalcNetPrice, dbo.fn_SafeDivide;
GO
محدودیتهای توابع
- نمیتوان در تابعها دستوراتی مثل INSERT/UPDATE/DELETE روی جداول اصلی اجرا کرد.
- استفاده از Dynamic SQL، Stored Procedureها و Temp Tableها مجاز نیست.
- تابعها باید بدون اثر جانبی باشند (فقط خروجی بر اساس ورودی).
- در نسخههای قبل از ۲۰۱۹، توابع اسکالر معمولاً کند هستند چون برای هر ردیف جداگانه اجرا میشوند.
مزایای استفاده از توابع در SQL Server
-
کاهش تکرار کد
با تعریف یک بار تابع، میتوان چندین بار از آن در کوئریهای مختلف استفاده کرد.
-
افزایش خوانایی و نگهداری کد
کدهای پیچیده در قالب توابع جدا میشوند و کوئری اصلی سادهتر و قابل فهمتر میماند.
-
امکان استفاده مجدد (Reusability)
یک تابع را میتوان در چندین پروژه یا دیتابیس مختلف به کار گرفت.
-
یکپارچگی و استانداردسازی محاسبات
محاسبات حساس مثل فرمولها یا قوانین کسبوکار فقط در تابع نوشته میشوند و همه جا نتیجه یکسانی دارند.
-
بهبود سازماندهی و ساختار پایگاه داده
توابع منطق تجاری (Business Logic) را از کد برنامه جدا کرده و در لایه دیتابیس نگه میدارند.
نمونههای پرکاربرد
-
محاسبه سن
CREATE FUNCTION dbo.fn_Age(@BirthDate DATE, @AsOf DATE=NULL)
RETURNS INT
AS
BEGIN
SET @AsOf=ISNULL(@AsOf,CAST(GETDATE() AS DATE));
RETURN DATEDIFF(YEAR,@BirthDate,@AsOf) -
CASE WHEN (MONTH(@AsOf)*100+DAY(@AsOf)) <
(MONTH(@BirthDate)*100+DAY(@BirthDate))
THEN 1 ELSE 0 END;
END;
GO
-
تابع نرمالسازی شماره تلفن
CREATE FUNCTION dbo.fn_NormalizePhone(@raw NVARCHAR(50))
RETURNS NVARCHAR(20)
AS
BEGIN
DECLARE @res NVARCHAR(20)='';
SET @res = REPLACE(@raw,' ','');
IF LEFT(@res,1)<>'0' SET @res='0'+@res;
RETURN @res;
END;
GO
-
iTVF برای مانده سفارشها
CREATE FUNCTION dbo.fn_OpenOrderBalance(@CustomerID INT)
RETURNS TABLE
AS
RETURN
(
SELECT o.OrderID,
SUM(oi.UnitPrice*oi.Quantity)-ISNULL(SUM(p.Amount),0) AS Balance
FROM Orders o
LEFT JOIN OrderItems oi ON o.OrderID=oi.OrderID
LEFT JOIN Payments p ON o.OrderID=p.OrderID
WHERE o.CustomerID=@CustomerID AND o.Status='Open'
GROUP BY o.OrderID
);
GO
🌟 آیا میخواهید به یک متخصص پایگاه داده تبدیل شوید و در دنیای فناوری اطلاعات بدرخشید؟
با دوره آموزشی SQL Server ما، شما میتوانید به راحتی و با روشی عملی، تمام مهارتهای لازم را یاد بگیرید!
این دوره به شما آموزش میدهد که چگونه دادهها را به بهترین شکل مدیریت کنید، گزارشهای قدرتمند بسازید و به تحلیلهای عمیق دست یابید.
با محتوای جذاب و پروژههای واقعی، شما نه تنها تئوری را یاد میگیرید، بلکه تواناییهای عملی خود را نیز تقویت میکنید.
پس فرصت را از دست ندهید! همین امروز به جمع یادگیرندگان ما بپیوندید و اولین قدم را به سوی آینده شغلی روشنتر بردارید!
⇐همین حالا شروع کنید و به دنیای دادهها بپیوندید!
تست و استقرار تابع در SQL
-
برای تست تابع اسکالر
SELECT dbo.fn_CalcNetPrice(100,9);
-
برای TVF
SELECT * FROM dbo.fn_GetOrdersByCustomer(1,'2025-01-01','2025-08-31');
در اسکریپتهای استقرار: اول DROP FUNCTION IF EXISTS و سپس CREATE FUNCTION بنویسید تا خطا رخ ندهد.
جمعبندی
تابعها در SQL Server ابزاری قدرتمند برای بازنویسی کمتر کد، افزایش خوانایی و محاسبات قابل استفاده مجدد هستند.
Scalar Function برای خروجی تکمقدار،
Inline TVF برای نتایج جدولی با کارایی بالا،
Multi-statement TVF برای منطق پیچیدهتر.
برای ایجاد تابع از CREATE FUNCTION، برای اصلاح از ALTER FUNCTION و برای حذف از DROP FUNCTION یا DROP FUNCTION IF EXISTS استفاده میشود.
با رعایت محدودیتها، توجه به کارایی و نوشتن تستهای مناسب، میتوانید تابعهایی سریع، امن و قابل نگهداری در پایگاهداده خود داشته باشید.




کاربران ما
شما هم نظرتون با ما دریاره “تابعها (FUNCTION) در SQL Server” اشتراک بزارید
برای ارسال نظر لطفا ورود یا ثبت نام کنید