۱۴۰۴/۰۷/۰۳
فانکشن ها (مقدماتی)
فانکشن (Function) چیست؟
- فانکشن در SQL Server یعنی یک قطعه کد قابل استفادهٔ دوباره که:
- ورودی (Parameter) میگیرد
- خروجی (Return) برمیگرداند
مثل تابع ریاضی: f(x) = x + 2 → هر وقت بهش ورودی بدی، یک خروجی میگیری.
انواع فانکشنها
- Scalar Function → یک مقدار برمیگرداند (مثل عدد یا متن).
- 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 توضیح:
- برای هر ردیف جدول Employees، مقدار
BirthDateمیرود داخل فانکشن. - فانکشن
DATEDIFFسال تولد تا امروز را حساب میکند. - خروجی (سن) در ستون 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 توضیح:
- ورودی = عدد 5 (یعنی مشتری با شناسه 5).
- فانکشن SELECT را اجرا میکند و فقط ردیفهای مربوط به آن مشتری را برمیگرداند.
- خروجی = یک جدول (مثل اجرای کوئری مستقیم).
سوال 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 توضیح:
- فانکشن ورودی را میگیرد.
- اگر باقیمانده تقسیم بر ۲ صفر بود → ‘Even’
- در غیر این صورت → ‘Odd’.
Accept Cookies
[your-shortcode]