خانه/ برنامه‌نویسی در SQL Server/ Functions

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) — یک مقدار برمی‌گرداند

sql
CREATE FUNCTION dbo.CalculateTax(@Amount DECIMAL(12,2))
RETURNS DECIMAL(12,2)
AS
BEGIN
  RETURN @Amount * 0.09;
END;

و استفاده از آن، دقیقاً مثل هر تابع دیگری:

sql
SELECT product, price, dbo.CalculateTax(price) AS Tax
FROM sales;

تابع جدولی (Table-Valued Function) — یک جدول برمی‌گرداند

نوع دیگر، به‌جای یک مقدار تکی، یک جدول کامل برمی‌گرداند — مثل یک View، اما با پارامتر ورودی:

sql
CREATE FUNCTION dbo.GetStudentsByCity(@City NVARCHAR(50))
RETURNS TABLE
AS
RETURN (
  SELECT full_name, grade
  FROM students
  WHERE city = @City
);
sql
SELECT * FROM dbo.GetStudentsByCity(N'تهران');

این دقیقاً همان View قابل‌پارامترسازی است — چیزی که خودِ View ساده نمی‌توانست انجام دهد (یادت هست View در درس قبل هیچ پارامتری نمی‌گرفت).

یادگیری بدون اجرای مستقیم: منطق داخل هر تابع، همان پرس‌وجوی معمولی است که در فصل‌های قبل یاد گرفتی — فقط بسته‌بندی‌اش فرق دارد. برای تمرین، همان بدنه‌ی تابع (بدون CREATE FUNCTION) را در Playground اجرا کن؛ نتیجه‌اش دقیقاً همان چیزی است که تابع برمی‌گرداند.

جمع‌بندی این درس

  • تابع اسکالر یک مقدار تکی برمی‌گرداند و مستقیم داخل SELECT قابل‌استفاده است.
  • تابع جدولی یک جدول کامل برمی‌گرداند — شبیه یک View قابل‌پارامترسازی.
  • تفاوت اصلی با Stored Procedure: تابع همیشه مقدار برمی‌گرداند و در SELECT قابل‌استفاده است؛ رویه این‌طور نیست.
  • هر دو، ویژگی مخصوص SQL Server هستند؛ SQLite معادلی ندارد.

در درس بعدی سراغ متغیرها می‌رویم — چطور یک مقدار موقت را داخل یک اسکریپت SQL نگه داریم و دوباره استفاده کنیم.