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 TVF | Table از یک Query |
| Multi-statement TVF | Table چندمرحلهای |
| 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;
GO3. سناریوی 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
);
GO4. اصول طراحی و 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 سه معیار ثابت برای ارزیابی نمونهها هستند.