"

تابع‌ها (FUNCTION) در SQL Server

تیم تحریریه 1404/06/28 0 11
لینک کوتاه https://zoheirsoftware.com/z/1ca3a5b31 |
تابع‌ها (FUNCTION) در SQL Server, انواع تابع‌ها در SQL,آموزش تابع ها (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 server

کاربردهای متداول توابع در SQL

  • استانداردسازی داده‌ها (مثل حذف فاصله‌های اضافی یا فرمت‌کردن شماره تلفن).
  • محاسبه مقادیر مالی یا آماری که در گزارش‌ها تکرار می‌شوند.
  • تجزیه رشته‌ها یا عملیات متنی پیچیده.
  • ساخت مجموعه داده‌های پارامتری مشابه View.

 انواع تابع‌ها در SQL

SQL Server سه نوع تابع کاربرساز دارد:

  • Scalar-valued Function (اسکالر)

    خروجی فقط یک مقدار تکی است، مثل عدد یا رشته.
  • Inline Table-Valued Function (iTVF)

    خروجی یک کوئری تک‌عبارتی است که مانند یک جدول عمل می‌کند. کارایی بالایی دارد چون بهینه‌ساز می‌تواند آن را در کوئری اصلی inline کند.
  • Multi-statement Table-Valued Function (mTVF)

    خروجی یک متغیر جدولی است که در بدنهٔ تابع با چند دستور پر می‌شود. انعطاف‌پذیر اما اغلب کندتر از iTVF.

 

 

معرفی و کاربرد انواع توابع (Functions) در SQL Server

ایجاد تابع در 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) را از کد برنامه جدا کرده و در لایه دیتابیس نگه می‌دارند.

 

 

 

 مزایای استفاده از توابع در SQL Server

نمونه‌های پرکاربرد

  • محاسبه سن

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 استفاده می‌شود.

با رعایت محدودیت‌ها، توجه به کارایی و نوشتن تست‌های مناسب، می‌توانید تابع‌هایی سریع، امن و قابل نگهداری در پایگاه‌داده خود داشته باشید.

دوره های مرتبط
آموزش Sql,آموزش sqlserver, آموزش جامع Sqlserver

آموزش پایگاه داده SqlServer

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

997,000 تومان

3.2k بازدید

ارسال دیدگاه

برای ارسال نظر لطفا ورود یا ثبت نام کنید.