خانه/ وبلاگ/ تفاوت Stored Procedure، Function و View در SQL Server
آموزش SQL

تفاوت Stored Procedure، Function و View در SQL Server

آموزش SQL ۵ آبان ۱۴۰۵ 10 دقیقه مطالعه

سه شیء View، Stored Procedure و Function همگی کد SQL را با یک نام ذخیره می‌کنند، اما هر کدام برای کار متفاوتی طراحی شده‌اند. اگر بدانی کدام را کِی استفاده کنی، کد تمیزتر و امن‌تری می‌نویسی.

جدول مقایسه

ویژگیViewStored ProcedureFunction
چیست؟جدول مجازی (پرس‌وجوی ذخیره‌شده)مجموعه‌ی دستورهای ذخیره‌شدهمحاسبه‌ای که مقدار یا جدول برمی‌گرداند
پارامترندارددارد (ورودی/خروجی)ورودی دارد
نحوه‌ی فراخوانیSELECT ... FROM ViewNameEXEC ProcNameداخل SELECT/WHERE/FROM
تغییر داده (INSERT/UPDATE)محدودبلهخیر
مقدار بازگشتییک مجموعه‌ی ردیفکد وضعیت، Result Set، پارامتر خروجیحتماً یک مقدار یا جدول
تراکنش و TRY...CATCH—بلهمحدود
کاربرد اصلیساده‌سازی و امنیت خواندنمنطق کسب‌وکار و عملیاتمحاسبه‌ی قابل‌استفاده‌ی مجدد

View: جدول مجازی

View یک SELECT است که با نام نگه‌داری می‌شود. دو مصرف مهم دارد: ساده کردن JOINهای پیچیده و محدود کردن ستون‌هایی که کاربر می‌بیند.

sql
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 اجرا می‌شود:

sql
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) برگرداند و داخل خودِ پرس‌وجو استفاده می‌شود:

sql
-- 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);
Scalar Function وقتی روی میلیون‌ها ردیف اجرا شود می‌تواند کند باشد، چون برای هر ردیف یک بار فراخوانی می‌شود. در این حالت از Inline Table-Valued Function یا محاسبه‌ی مستقیم در پرس‌وجو استفاده کن.

کدام را انتخاب کنم؟

  • فقط می‌خواهی یک پرس‌وجوی تکراری یا حساس را ساده یا محدود کنی ← 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 بهتر است.

مصطفی موسویسازنده و نویسنده‌ی SQLFarsi. اگر اشتباهی در مقاله دیدی یا پیشنهادی داری، از طریق mousavi.dev خبر بده.

می‌خوای SQL را از پایه و با تمرین یاد بگیری؟

دوره‌ی رایگان SQLFarsi را با Playground و پروژه‌های واقعی دنبال کن.

شروع یادگیری