بررسی نحوه ایجاد توابعی با خروجی جدول محور در SQL Server
آموزش ایجاد توابع جدولمحور در SQL Server برای بازگرداندن دادهها بهصورت جدول و استفاده در کوئریهای مختلف می باشد.
بررسی نحوه ایجاد توابعی با خروجی جدولمحور در SQL Server
در پایگاه داده SQL Server، توابع (Functions) یکی از ابزارهای قدرتمند برای سازماندهی منطق برنامه، افزایش قابلیت استفاده مجدد از کدها و بهبود خوانایی پرسوجوها هستند.
در میان انواع مختلف توابع، توابع جدولمحور یا Table-Valued Functions (TVF) اهمیت ویژهای دارند؛ زیرا میتوانند مجموعهای از رکوردها را همانند یک جدول بازگردانند.
این ویژگی باعث میشود بتوان از آنها در دستورات SELECT، JOIN، APPLY و سایر عملیات پایگاه داده استفاده کرد.
توابع جدولمحور راهکاری مناسب برای پیادهسازی منطقهای پیچیدهای هستند که نیاز به بازگرداندن چندین ردیف داده دارند.
به جای تکرار کوئریهای مشابه در بخشهای مختلف سیستم، میتوان منطق موردنظر را در قالب یک تابع جدولمحور تعریف کرد و در هر زمان از آن بهره برد.
تابع جدولمحور چیست؟
تابع جدولمحور نوعی تابع در SQL Server است که خروجی آن یک جدول است. برخلاف توابع اسکالر (Scalar Functions) که تنها یک مقدار را بازمیگردانند، این توابع میتوانند چندین سطر و ستون را به عنوان خروجی ارائه دهند.
به طور کلی دو نوع تابع جدولمحور در SQL Server وجود دارد:
-
Inline Table-Valued Function
-
Multi-Statement Table-Valued Function
هر یک از این توابع ویژگیها و کاربردهای خاص خود را دارند.
مزایای استفاده از توابع جدولمحور در SQL Server
استفاده از TVF مزایای متعددی دارد که از جمله مهمترین آنها میتوان به موارد زیر اشاره کرد:
-
استفاده مجدد از کد
به جای نوشتن مکرر کوئریهای پیچیده، میتوان یک تابع ایجاد کرد و در نقاط مختلف پروژه از آن استفاده نمود. -
افزایش خوانایی
کوئریهای طولانی و پیچیده میتوانند در قالب توابع دستهبندی شوند تا ساختار برنامه مرتبتر شود. -
نگهداری آسانتر
در صورت تغییر منطق کسبوکار، تنها کافی است تابع اصلاح شود و نیازی به تغییر تمام کوئریها نخواهد بود. -
افزایش انعطافپذیری
توابع جدولمحور میتوانند پارامتر دریافت کرده و خروجیهای مختلفی تولید کنند.
Inline Table-Valued Function
این نوع تابع سادهترین و سریعترین نوع TVF محسوب میشود.
در این مدل، خروجی تابع مستقیماً از یک دستور SELECT تشکیل میشود و نیازی به تعریف متغیر جدول وجود ندارد.
CREATE FUNCTION dbo.GetProducts()
RETURNS TABLE
AS
RETURN
(
SELECT *
FROM Products
)
در مثال فوق، تابع تمام رکوردهای جدول Products را بازمیگرداند.
اجرای تابع
برای مشاهده خروجی تابع میتوان از دستور زیر استفاده کرد:
SELECT *
FROM dbo.GetProducts()
خروجی دقیقاً مشابه اجرای یک SELECT معمولی خواهد بود.
ایجاد تابع با پارامتر
یکی از مهمترین مزایای TVF امکان دریافت پارامتر است.
مثال:
CREATE FUNCTION dbo.GetProductsByCategory
(
@CategoryID INT
)
RETURNS TABLE
AS
RETURN
(
SELECT ProductID,
ProductName,
UnitPrice
FROM Products
WHERE CategoryID = @CategoryID
)
استفاده:
SELECT *
FROM dbo.GetProductsByCategory(2)
در این مثال تنها محصولات متعلق به دستهبندی شماره 2 بازگردانده میشوند.
استفاده در JOIN
توابع جدولمحور را میتوان مانند یک جدول واقعی در عملیات JOIN استفاده کرد.
نمونه:
SELECT
C.CategoryName,
P.ProductName
FROM Categories C
INNER JOIN dbo.GetProductsByCategory(1) P
ON C.CategoryID = 1
این قابلیت انعطاف بالایی در طراحی کوئریها ایجاد میکند.
Multi-Statement Table-Valued Function
گاهی اوقات یک SELECT ساده پاسخگوی نیاز ما نیست و لازم است چندین عملیات روی دادهها انجام شود.
در این شرایط از Multi-Statement TVF استفاده میکنیم.
-
ساختار کلی
CREATE FUNCTION dbo.GetEmployeeList()
RETURNS @Employees TABLE
(
EmployeeID INT,
FullName NVARCHAR(200),
Salary MONEY
)
AS
BEGIN
INSERT INTO @Employees
SELECT
EmployeeID,
FirstName + ' ' + LastName,
Salary
FROM Employees
RETURN
END
در این مدل ابتدا یک جدول خروجی تعریف میشود و سپس دادهها در آن درج میگردند.
-
فراخوانی تابع
SELECT *
FROM dbo.GetEmployeeList()
تابع چند دستوری با پارامتر
نمونه:
CREATE FUNCTION dbo.GetOrdersByCustomer
(
@CustomerID INT
)
RETURNS @Result TABLE
(
OrderID INT,
OrderDate DATETIME,
TotalAmount MONEY
)
AS
BEGIN
INSERT INTO @Result
SELECT
OrderID,
OrderDate,
TotalAmount
FROM Orders
WHERE CustomerID = @CustomerID
RETURN
END
فراخوانی:
SELECT *
FROM dbo.GetOrdersByCustomer(10)
تفاوت Inline و Multi-Statement
| ویژگی | Multi-Statement TVF | Inline TVF |
| سرعت | بسیار بالا | پایینتر |
| ساختار | ساده | پیچیدهتر |
| قابلیت پردازش | محدود | بیشتر |
| مصرف منابع | کمتر | بیشتر |
| بهینهسازی | بهتر | ضعیفتر |
در اکثر پروژهها، اگر امکان استفاده از Inline TVF وجود داشته باشد، انتخاب مناسبتری خواهد بود.
🌟 آیا میخواهید به یک متخصص پایگاه داده تبدیل شوید و در دنیای فناوری اطلاعات بدرخشید؟با دوره آموزشی SQL Server ما، شما میتوانید به راحتی و با روشی عملی، تمام مهارتهای لازم را یاد بگیرید!
این دوره به شما آموزش میدهد که چگونه دادهها را به بهترین شکل مدیریت کنید، گزارشهای قدرتمند بسازید و به تحلیلهای عمیق دست یابید.
با محتوای جذاب و پروژههای واقعی، شما نه تنها تئوری را یاد میگیرید، بلکه تواناییهای عملی خود را نیز تقویت میکنید.
پس فرصت را از دست ندهید! همین امروز به جمع یادگیرندگان ما بپیوندید و اولین قدم را به سوی آینده شغلی روشنتر بردارید!
استفاده از APPLY
یکی از کاربردهای جذاب توابع جدولمحور، استفاده همراه با CROSS APPLY و OUTER APPLY است.
مثال:
SELECT
C.CustomerID,
O.OrderID
FROM Customers C
CROSS APPLY dbo.GetOrdersByCustomer(C.CustomerID) O
در این مثال تابع برای هر مشتری اجرا شده و سفارشهای مرتبط را نمایش میدهد.
استفاده در گزارشگیری
توابع جدولمحور برای تهیه گزارشهای مدیریتی بسیار مفید هستند.
مثال:
CREATE FUNCTION dbo.GetMonthlySales
(
@Year INT,
@Month INT
)
RETURNS TABLE
AS
RETURN
(
SELECT
OrderID,
CustomerID,
TotalAmount
FROM Orders
WHERE YEAR(OrderDate)=@Year
AND MONTH(OrderDate)=@Month
)
استفاده:
SELECT *
FROM dbo.GetMonthlySales(2025,5)
ترکیب چند جدول در خروجی تابع
مثال:
CREATE FUNCTION dbo.GetOrderDetails
(
@OrderID INT
)
RETURNS TABLE
AS
RETURN
(
SELECT
O.OrderID,
C.CustomerName,
P.ProductName,
OD.Quantity
FROM Orders O
INNER JOIN Customers C
ON O.CustomerID=C.CustomerID
INNER JOIN OrderDetails OD
ON O.OrderID=OD.OrderID
INNER JOIN Products P
ON OD.ProductID=P.ProductID
WHERE O.OrderID=@OrderID
)
این تابع اطلاعات کاملی از سفارش را بازمیگرداند.
بهینهسازی توابع جدولمحور در SQL Server
برای دستیابی به بهترین عملکرد باید چند نکته مهم را رعایت کرد.
-
استفاده از Inline TVF
تا حد امکان از Inline TVF استفاده کنید زیرا بهینهساز SQL Server میتواند آن را درون کوئری اصلی ادغام کند.
-
کاهش تعداد ستونها
تنها ستونهای موردنیاز را بازگردانید.
-
- نامناسب:
SELECT *
-
- مناسب:
SELECT ProductID,
ProductName
-
ایجاد ایندکس مناسب
اگر تابع روی جدولهای بزرگ اجرا میشود، وجود ایندکس مناسب اهمیت زیادی دارد.
نمونه:
CREATE INDEX IX_Products_CategoryID
ON Products(CategoryID)
-
اجتناب از منطق پیچیده
توابعی که شامل پردازشهای سنگین هستند ممکن است باعث افت عملکرد شوند.

مشاهده توابع موجود در SQL Server
برای مشاهده فهرست توابع موجود میتوان از دستور زیر استفاده کرد:
SELECT *
FROM sys.objects
WHERE type IN ('TF','IF')
کدهای فوق:
TF = Multi Statement TVF
IF = Inline TVF
حذف تابع در SQL Server
برای حذف یک تابع:
DROP FUNCTION dbo.GetProducts
ویرایش تابع در SQL Server
برای تغییر تابع:
ALTER FUNCTION dbo.GetProducts
RETURNS TABLE
AS
RETURN
(
SELECT ProductID,
ProductName
FROM Products
)
کاربردهای عملی توابع جدولمحور در SQL Server
این توابع در پروژههای واقعی کاربردهای فراوانی دارند:
-
سیستم فروشگاهی
- نمایش محصولات هر دسته
- گزارش سفارشها
- محاسبه فروش ماهانه
-
سیستم منابع انسانی
- فهرست کارمندان فعال
- گزارش حقوق و مزایا
- سوابق حضور و غیاب
- سیستم مالی
- گزارش تراکنشها
- مانده حساب مشتریان
- گزارش گردش مالی
-
سامانههای مدیریتی
- داشبوردهای مدیریتی
- گزارشهای آماری
- تحلیل دادهها
نکات امنیتی توابع جدولمحور در SQL Server
در طراحی توابع جدولمحور بهتر است:
- دسترسی کاربران محدود شود.
- از اعتبارسنجی پارامترها استفاده گردد.
- اطلاعات حساس بدون نیاز بازگردانده نشوند.
- سطح دسترسی مناسب برای کاربران تعریف شود.
جمعبندی
توابع جدولمحور (Table-Valued Functions) یکی از قابلیتهای بسیار کاربردی SQL Server هستند که امکان بازگرداندن مجموعهای از دادهها را در قالب یک جدول فراهم میکنند.
این توابع به دو دسته Inline و Multi-Statement تقسیم میشوند و هر کدام کاربردهای خاص خود را دارند.
استفاده صحیح از TVF باعث افزایش خوانایی کد، کاهش تکرار، سادهسازی نگهداری سیستم و بهبود ساختار پایگاه داده میشود.
در بسیاری از پروژههای حرفهای، توابع جدولمحور به عنوان ابزاری قدرتمند برای گزارشگیری، پردازش دادهها و پیادهسازی منطق کسبوکار مورد استفاده قرار میگیرند و نقش مهمی در توسعه سیستمهای مقیاسپذیر و قابل نگهداری دارند.



کاربران ما
شما هم نظرتون با ما دریاره “بررسی نحوه ایجاد توابعی با خروجی جدول محور در SQL Server” اشتراک بزارید
برای ارسال نظر لطفا ورود یا ثبت نام کنید