تفاوت Stored Procedure، Function و View در SQL Server
سه شیء View، Stored Procedure و Function همگی کد SQL را با یک نام ذخیره میکنند، اما هر کدام برای کار متفاوتی طراحی شدهاند. اگر بدانی کدام را کِی استفاده کنی، کد تمیزتر و امنتری مینویسی.
جدول مقایسه
| ویژگی | View | Stored Procedure | Function |
|---|---|---|---|
| چیست؟ | جدول مجازی (پرسوجوی ذخیرهشده) | مجموعهی دستورهای ذخیرهشده | محاسبهای که مقدار یا جدول برمیگرداند |
| پارامتر | ندارد | دارد (ورودی/خروجی) | ورودی دارد |
| نحوهی فراخوانی | SELECT ... FROM ViewName | EXEC ProcName | داخل SELECT/WHERE/FROM |
| تغییر داده (INSERT/UPDATE) | محدود | بله | خیر |
| مقدار بازگشتی | یک مجموعهی ردیف | کد وضعیت، Result Set، پارامتر خروجی | حتماً یک مقدار یا جدول |
| تراکنش و TRY...CATCH | — | بله | محدود |
| کاربرد اصلی | سادهسازی و امنیت خواندن | منطق کسبوکار و عملیات | محاسبهی قابلاستفادهی مجدد |
View: جدول مجازی
View یک SELECT است که با نام نگهداری میشود. دو مصرف مهم دارد: ساده کردن JOINهای پیچیده و محدود کردن ستونهایی که کاربر میبیند.
CREATE VIEW dbo.vw_StudentGrades AS SELECT s.StudentId, s.FullName, c.Title, e.Grade FROM Student s JOIN Enrollment e ON e.StudentId = s.StudentId JOIN Course c ON c.CourseId = e.CourseId; GO SELECT * FROM dbo.vw_StudentGrades WHERE Grade >= 18;
کاربری که فقط به View مجوز SELECT دارد، جدولهای پایه را نمیبیند؛ پس View راهی ساده برای پنهان کردن ستونهای حساس است.
Stored Procedure: منطق و عملیات
Procedure میتواند چند دستور، شرط، حلقه، تراکنش و تغییر داده داشته باشد و با EXEC اجرا میشود:
CREATE PROCEDURE dbo.usp_EnrollStudent @StudentId INT, @CourseId INT AS BEGIN SET NOCOUNT ON; BEGIN TRY BEGIN TRANSACTION; IF EXISTS (SELECT 1 FROM Enrollment WHERE StudentId = @StudentId AND CourseId = @CourseId) THROW 50001, N'این ثبتنام قبلاً انجام شده است', 1; INSERT INTO Enrollment (StudentId, CourseId) VALUES (@StudentId, @CourseId); COMMIT; END TRY BEGIN CATCH IF @@TRANCOUNT > 0 ROLLBACK; THROW; END CATCH END; GO EXEC dbo.usp_EnrollStudent @StudentId = 1, @CourseId = 2;
مزیتها: کد یکجا نگهداری میشود، پارامترها از SQL Injection جلوگیری میکنند و میتوان فقط به EXECUTE روی Procedure مجوز داد.
Function: محاسبهی قابلاستفادهی مجدد
Function باید یک مقدار (Scalar) یا یک جدول (Table-Valued) برگرداند و داخل خودِ پرسوجو استفاده میشود:
-- Scalar: محاسبهی سن CREATE FUNCTION dbo.fn_Age (@BirthDate DATE) RETURNS INT AS BEGIN RETURN DATEDIFF(YEAR, @BirthDate, GETDATE()); END; GO SELECT FullName, dbo.fn_Age(BirthDate) AS Age FROM Student; -- Inline Table-Valued: مثل یک View پارامتردار CREATE FUNCTION dbo.fn_GradesOfStudent (@StudentId INT) RETURNS TABLE AS RETURN (SELECT CourseId, Grade FROM Enrollment WHERE StudentId = @StudentId); GO SELECT * FROM dbo.fn_GradesOfStudent(1);
کدام را انتخاب کنم؟
- فقط میخواهی یک پرسوجوی تکراری یا حساس را ساده یا محدود کنی ← View.
- عملیات چندمرحلهای، تغییر داده، تراکنش یا API برای برنامه ← Stored Procedure.
- محاسبهای که باید داخل SELECT یا WHERE استفاده شود ← Function (ترجیحاً Inline).
- پارامتر لازم داری و نتیجه جدول است ← Inline Table-Valued Function (یا Procedure).
برای یادگیری جزئیات هر کدام، درسهای Views، Stored Procedures و Functions را بخوان.
سوالات متداول دربارهی این موضوع
آیا View داده را ذخیره میکند؟
خیر؛ View فقط یک پرسوجوی ذخیرهشده است و هر بار هنگام استفاده اجرا میشود. تنها استثنا Indexed View (Materialized) است که نتیجهاش بهصورت فیزیکی نگهداری میشود.
آیا Function میتواند داده را تغییر دهد؟
Functionهای کاربری در SQL Server نمیتوانند INSERT/UPDATE/DELETE روی جدولهای دائمی انجام دهند؛ این کار مخصوص Stored Procedure است.
کدام سریعتر است؟
مقایسهی سرعت ذاتی معنا ندارد؛ هر سه در نهایت یک پرسوجو اجرا میکنند. Scalar Functionها که برای هر ردیف اجرا میشوند میتوانند کندی ایجاد کنند، پس برای حجم زیاد داده Inline Table-Valued Function بهتر است.
میخوای SQL را از پایه و با تمرین یاد بگیری؟
دورهی رایگان SQLFarsi را با Playground و پروژههای واقعی دنبال کن.
شروع یادگیری