دسته بندی مقالات
- بیشتر -محصولات
- بیشتر -آخرین مقالات
- بیشتر --
تابعها (FUNCTION) در SQL Server
1404/06/28 -
کنترل pictureBox در سی شارپ
1404/06/27 -
System Tables در Sql Server
1404/06/26 -
کنترل panel در سی شارپ
1404/06/25 -
security policy در Sql Server
1404/05/05 -
کنترل pageSetupDialog در سی شارپ
1404/05/03
تابعها (FUNCTION) در 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 استفاده میشود.
با رعایت محدودیتها، توجه به کارایی و نوشتن تستهای مناسب، میتوانید تابعهایی سریع، امن و قابل نگهداری در پایگاهداده خود داشته باشید.
دوره های مرتبط

آموزش پایگاه داده SqlServer
پایگاه داده Sqlserver یکی از پایگاه داده های مهم برای ذخیره اطلاعات محسوب میشود .