۱۴۰۴/۰۷/۰۳ Nebular

فانکشن ها (مقدماتی)

فانکشن (Function) چیست؟

  • فانکشن در SQL Server یعنی یک قطعه کد قابل استفادهٔ دوباره که:
    • ورودی (Parameter) می‌گیرد
    • خروجی (Return) برمی‌گرداند

مثل تابع ریاضی: f(x) = x + 2 → هر وقت بهش ورودی بدی، یک خروجی می‌گیری.


انواع فانکشن‌ها

  1. Scalar Function → یک مقدار برمی‌گرداند (مثل عدد یا متن).
  2. Table-Valued Function → یک جدول برمی‌گرداند (مثل SELECT که خروجی چند ردیف دارد).

برای آزمون استخدامی، همین دو تا رو بدونی کافیه.


نحوه تعریف فانکشن (ساده)

1) Scalar Function

CREATE FUNCTION fn_AddTwo(@number INT)
RETURNS INT
AS
BEGIN
    RETURN @number + 2
END
  • اسم فانکشن: fn_AddTwo
  • ورودی: یک عدد (@number)
  • خروجی: همان عدد + ۲

نحوه استفاده:

SELECT dbo.fn_AddTwo(5) AS Result; -- خروجی = 7

2) Table-Valued Function

CREATE FUNCTION fn_GetOrdersByCustomer(@CustomerID INT)
RETURNS TABLE
AS
RETURN
(
    SELECT OrderID, OrderDate, TotalAmount
    FROM Orders
    WHERE CustomerID = @CustomerID
)
  • فانکشن: fn_GetOrdersByCustomer
  • ورودی: آیدی مشتری
  • خروجی: یک جدول از سفارش‌های همان مشتری

نحوه استفاده:

SELECT * FROM dbo.fn_GetOrdersByCustomer(1);

مقایسه فانکشن و Stored Procedure (ساده)

  • فانکشن: همیشه یک چیز برمی‌گرداند (مقدار یا جدول). داخل SELECT قابل استفاده است.
  • استور پروسیجر: می‌تواند چندین کار کند (INSERT/UPDATE/DELETE، چندین خروجی) ولی در SELECT مستقیم نمی‌توانی از آن استفاده کنی.

تمرین آزمونی (با حل و Trace)

سوال 1:

یک فانکشن بساز که سن کارمند را از تاریخ تولد محاسبه کند.

پاسخ:

CREATE FUNCTION fn_CalcAge(@BirthDate DATE)
RETURNS INT
AS
BEGIN
    RETURN DATEDIFF(YEAR, @BirthDate, GETDATE())
END

استفاده:

SELECT Name, dbo.fn_CalcAge(BirthDate) AS Age
FROM Employees;

Trace توضیح:

  1. برای هر ردیف جدول Employees، مقدار BirthDate می‌رود داخل فانکشن.
  2. فانکشن DATEDIFF سال تولد تا امروز را حساب می‌کند.
  3. خروجی (سن) در ستون Age برمی‌گردد.

سوال 2:

جدول Orders داریم. یک فانکشن بساز که تمام سفارش‌های یک مشتری خاص را بدهد.

پاسخ:

CREATE FUNCTION fn_GetOrders(@CID INT)
RETURNS TABLE
AS
RETURN
(
    SELECT OrderID, OrderDate, TotalAmount
    FROM Orders
    WHERE CustomerID = @CID
)

استفاده:

SELECT * FROM dbo.fn_GetOrders(5);

Trace توضیح:

  1. ورودی = عدد 5 (یعنی مشتری با شناسه 5).
  2. فانکشن SELECT را اجرا می‌کند و فقط ردیف‌های مربوط به آن مشتری را برمی‌گرداند.
  3. خروجی = یک جدول (مثل اجرای کوئری مستقیم).

سوال 3:

یک فانکشن بساز که عدد ورودی را بگیرد و اگر زوج بود بنویسد ‘Even’، اگر فرد بود بنویسد ‘Odd’.

پاسخ:

CREATE FUNCTION fn_IsEven(@num INT)
RETURNS VARCHAR(10)
AS
BEGIN
    RETURN CASE WHEN @num % 2 = 0 THEN 'Even' ELSE 'Odd' END
END

استفاده:

SELECT dbo.fn_IsEven(10) AS Result; -- Even
SELECT dbo.fn_IsEven(7) AS Result;  -- Odd

Trace توضیح:

  1. فانکشن ورودی را می‌گیرد.
  2. اگر باقیمانده تقسیم بر ۲ صفر بود → ‘Even’
  3. در غیر این صورت → ‘Odd’.
Accept Cookies
Accept Cookies
[your-shortcode]