Function: تابعی که همیشه یک مقدار برمیگرداند
CREATE FUNCTION هم مثل Stored Procedure، مخصوص SQL Server است و SQLite این قابلیت را ندارد. این درس هم جعبهی زنده ندارد؛ فقط کد واقعی SQL Server را میبینیم.در طول دوره، همیشه از توابع آماده استفاده کردیم — COUNT، AVG، COALESCE، ROUND. یک Function تعریفشده توسط کاربر (User-Defined Function) یعنی تابع دلخواه خودت را، با منطق دلخواه خودت، بسازی.
تفاوت کلیدی با Stored Procedure
تفاوت اصلی Function با Procedure این است: تابع همیشه یک مقدار (یا جدول) برمیگرداند، و میتوان مستقیم داخل یک SELECT صدایش زد — دقیقاً مثل ROUND() یا COALESCE(). رویه چنین محدودیتی ندارد و نمیتوان مستقیم داخل SELECT صدایش زد.
تابع اسکالر (Scalar Function) — یک مقدار برمیگرداند
CREATE FUNCTION dbo.CalculateTax(@Amount DECIMAL(12,2)) RETURNS DECIMAL(12,2) AS BEGIN RETURN @Amount * 0.09; END;
و استفاده از آن، دقیقاً مثل هر تابع دیگری:
SELECT product, price, dbo.CalculateTax(price) AS Tax FROM sales;
تابع جدولی (Table-Valued Function) — یک جدول برمیگرداند
نوع دیگر، بهجای یک مقدار تکی، یک جدول کامل برمیگرداند — مثل یک View، اما با پارامتر ورودی:
CREATE FUNCTION dbo.GetStudentsByCity(@City NVARCHAR(50)) RETURNS TABLE AS RETURN ( SELECT full_name, grade FROM students WHERE city = @City );
SELECT * FROM dbo.GetStudentsByCity(N'تهران');
این دقیقاً همان View قابلپارامترسازی است — چیزی که خودِ View ساده نمیتوانست انجام دهد (یادت هست View در درس قبل هیچ پارامتری نمیگرفت).
CREATE FUNCTION) را در Playground اجرا کن؛ نتیجهاش دقیقاً همان چیزی است که تابع برمیگرداند.جمعبندی این درس
- تابع اسکالر یک مقدار تکی برمیگرداند و مستقیم داخل
SELECTقابلاستفاده است. - تابع جدولی یک جدول کامل برمیگرداند — شبیه یک View قابلپارامترسازی.
- تفاوت اصلی با Stored Procedure: تابع همیشه مقدار برمیگرداند و در
SELECTقابلاستفاده است؛ رویه اینطور نیست. - هر دو، ویژگی مخصوص SQL Server هستند؛ SQLite معادلی ندارد.
در درس بعدی سراغ متغیرها میرویم — چطور یک مقدار موقت را داخل یک اسکریپت SQL نگه داریم و دوباره استفاده کنیم.