فصل 18 از 24 درس 1 از 1

Function در SQL Server

Function در SQL Server

بخشی از آموزش جامع SQL Server

محتوای درس Function در SQL Server

T-SQL | Scalar Function و Table-Valued Function

User-Defined Function مقدار Scalar یا Table برمی‌گرداند و می‌تواند داخل Query ترکیب شود. محدودیت‌ها و هزینه Function باید در Queryهای پرتکرار اندازه‌گیری شود.

متن این فصل با رویکرد مرجع فنی و قابل استفاده در پروژه واقعی تنظیم شده است؛ مثال‌ها در امتداد مدل StoreDb نوشته شده‌اند و اصطلاحات اصلی SQL Server و T-SQL به‌صورت یکدست به‌کار می‌روند.

1. مفاهیم و قراردادهای اصلی

User-Defined Function مقدار Scalar یا Table برمی‌گرداند و می‌تواند داخل Query ترکیب شود. محدودیت‌ها و هزینه Function باید در Queryهای پرتکرار اندازه‌گیری شود.

در طراحی پایگاه داده، Syntax تنها بخشی از مسئله است. نوع داده، Constraint، الگوی دسترسی، Transaction و هزینه اجرای Query باید هم‌زمان با نیاز Domain در نظر گرفته شوند.

مفهومکارکرد
Scalar UDFیک مقدار
Inline TVFTable از یک Query
Multi-statement TVFTable چندمرحله‌ای
RETURNSنوع خروجی
RETURNخروجی Function
APPLYمصرف TVF وابسته

2. ساختار و Syntax پایه

برای منطق جدولی، Inline TVF غالباً Contract قابل ترکیب‌تری نسبت به Procedure می‌دهد. Scalar UDF در مسیر Row-by-row نیازمند توجه به نسخه و Plan است.

CREATE OR ALTER FUNCTION dbo.ufn_CalculateLineTotal
(
    @Quantity int,
    @UnitPrice decimal(18,2)
)
RETURNS decimal(18,2)
AS
BEGIN
    RETURN @Quantity * @UnitPrice;
END;
GO

3. سناریوی StoreDb

Inline TVF سفارش‌های یک Customer را به‌صورت Table قابل Join برمی‌گرداند و Parameter در قرارداد Function قرار می‌گیرد.

نمونه‌های این فصل بر مدل فروشگاهی StoreDb بنا شده‌اند تا ارتباط مفاهیم میان فصل‌ها حفظ شود و Queryها در یک Context یکپارچه قابل بررسی باشند.

CREATE OR ALTER FUNCTION dbo.ufn_CustomerOrders(@CustomerId int)
RETURNS TABLE
AS
RETURN
(
    SELECT Id, OrderDate, TotalAmount, Status
    FROM dbo.Orders
    WHERE CustomerId = @CustomerId
);
GO

4. اصول طراحی و Performance

طراحی پایدار باید هم صحت داده و هم هزینه اجرای عملیات را پوشش دهد. انتخاب ساده‌تر زمانی ترجیح دارد که Contract داده را روشن‌تر و رفتار Optimizer را قابل پیش‌بینی‌تر نگه دارد.

  • Function بدون Side Effect طراحی شود.
  • Inline TVF برای Query composable مناسب است.
  • Scalar UDF پرتکرار با Plan واقعی اندازه‌گیری شود.
  • Data Type خروجی دقیق تعریف شود.

5. خطاهای رایج و نکات ایمنی

دستورهای SQL می‌توانند مستقیماً داده و ساختار را تغییر دهند؛ بنابراین بازبینی Context، تعداد Rowهای هدف و اثر Transaction قبل از اجرای تغییرات اهمیت عملی دارد.

  • استفاده Function Scalar پرهزینه روی میلیون‌ها Row بدون اندازه‌گیری.
  • انتظار تغییر داده از Function.
  • Multi-statement TVF بدون بررسی Cardinality.
  • پنهان کردن Query پیچیده و کند داخل Function.

6. چک‌لیست نهایی فصل

  • نوع Function بر اساس خروجی انتخاب شده است.
  • Function قابل استفاده در SELECT/JOIN است.
  • Performance مسیر پرتکرار اندازه‌گیری شده است.
  • Contract خروجی پایدار است.

7. جمع‌بندی

خروجی این فصل باید به تصمیمی قابل اتکا در طراحی یا Query منجر شود؛ صحت داده، قابلیت نگهداری و رفتار Performance سه معیار ثابت برای ارزیابی نمونه‌ها هستند.