SQL Server Training with AdventureWorks Sample Database

آموزش گام‌به‌گام SQL Server با دیتابیس نمونه‌ی AdventureWorks | از مبتدی تا پیشرفته | (قسمت ۹)


درس ۹: Stored Procedure و پارامترها

🎯 هدف درس:

در این درس یاد می‌گیرید که Stored Procedure چیست، چگونه ساخته می‌شود و چطور می‌توان برای آن پارامتر ورودی و خروجی تعریف کرد. این بخش از SQL برای خودکارسازی کوئری‌ها، افزایش سرعت اجرا و حفظ امنیت بسیار مهم است.

📘 مفهوم نظری:

Stored Procedure در واقع مجموعه‌ای از دستورات SQL است که در پایگاه داده ذخیره می‌شود و می‌توان آن را مانند یک تابع اجرا کرد. مزیت آن این است که بارها بدون نیاز به نوشتن مجدد کوئری‌ها قابل استفاده است.

۱. ساخت Stored Procedure ساده:

CREATE PROCEDURE usp_GetAllProducts
AS
BEGIN
    SELECT ProductID, Name, ListPrice
    FROM Production.Product;
END;

اجرا:

EXEC usp_GetAllProducts;

۲. ساخت Stored Procedure با پارامتر ورودی:

CREATE PROCEDURE usp_GetProductsByPrice
    @MinPrice DECIMAL(10,2)
AS
BEGIN
    SELECT ProductID, Name, ListPrice
    FROM Production.Product
    WHERE ListPrice > @MinPrice;
END;

اجرا:

EXEC usp_GetProductsByPrice @MinPrice = 1000;

۳. پارامترهای ورودی متعدد:

CREATE PROCEDURE usp_GetProductsByRange
    @MinPrice DECIMAL(10,2),
    @MaxPrice DECIMAL(10,2)
AS
BEGIN
    SELECT ProductID, Name, ListPrice
    FROM Production.Product
    WHERE ListPrice BETWEEN @MinPrice AND @MaxPrice;
END;

اجرا:

EXEC usp_GetProductsByRange @MinPrice = 500, @MaxPrice = 2000;

۴. پارامتر خروجی (OUTPUT Parameter):

CREATE PROCEDURE usp_CountEmployees
    @Total INT OUTPUT
AS
BEGIN
    SELECT @Total = COUNT(*)
    FROM HumanResources.Employee;
END;

اجرا با پارامتر خروجی:

DECLARE @Result INT;
EXEC usp_CountEmployees @Total = @Result OUTPUT;
SELECT @Result AS EmployeeCount;

۵. ویرایش Stored Procedure (ALTER):

ALTER PROCEDURE usp_GetProductsByPrice
    @MinPrice DECIMAL(10,2)
AS
BEGIN
    SELECT ProductID, Name, ListPrice
    FROM Production.Product
    WHERE ListPrice > @MinPrice
    ORDER BY ListPrice DESC;
END;

۶. حذف Stored Procedure:

DROP PROCEDURE usp_GetAllProducts;

۷. استفاده از شرط IF در Stored Procedure:

CREATE PROCEDURE usp_CheckPrice
    @ProductID INT
AS
BEGIN
    DECLARE @Price DECIMAL(10,2);
    SELECT @Price = ListPrice FROM Production.Product WHERE ProductID = @ProductID;

    IF @Price > 1000
        PRINT 'Expensive Product';
    ELSE
        PRINT 'Normal Product';
END;

۸. استفاده از پارامتر پیش‌فرض:

CREATE PROCEDURE usp_GetTopProducts
    @Count INT = 5
AS
BEGIN
    SELECT TOP (@Count) ProductID, Name, ListPrice
    FROM Production.Product
    ORDER BY ListPrice DESC;
END;

۹. استفاده از TRY…CATCH برای مدیریت خطا:

CREATE PROCEDURE usp_SafeDeleteProduct
    @ProductID INT
AS
BEGIN
    BEGIN TRY
        DELETE FROM Production.Product
        WHERE ProductID = @ProductID;
    END TRY
    BEGIN CATCH
        PRINT 'Error: Unable to delete product.';
    END CATCH
END;

۱۰. مشاهده متن تعریف Stored Procedure:

sp_helptext 'usp_GetProductsByRange';

🧠 تمرین‌های عملی:

  • تمرین ۱: ساخت Stored Procedure برای نمایش ۱۰ محصول گران‌تر از مقدار ورودی.
  • تمرین ۲: ساخت Stored Procedure با دو پارامتر ورودی برای محدوده قیمت.
  • تمرین ۳: ساخت Stored Procedure برای شمارش کارمندان با پارامتر خروجی.
  • تمرین ۴: افزودن شرط IF برای بررسی گران یا ارزان بودن محصول.
  • تمرین ۵ (چالشی): ساخت Procedure حذف ایمن (Safe Delete) با TRY…CATCH.

💡 پاسخ تمرین‌های عملی:

-- تمرین ۱
CREATE PROCEDURE usp_TopExpensiveProducts
    @MinPrice DECIMAL(10,2)
AS
BEGIN
    SELECT TOP (10) ProductID, Name, ListPrice
    FROM Production.Product
    WHERE ListPrice > @MinPrice
    ORDER BY ListPrice DESC;
END;

-- تمرین ۲
CREATE PROCEDURE usp_ProductRange
    @Min DECIMAL(10,2),
    @Max DECIMAL(10,2)
AS
BEGIN
    SELECT ProductID, Name, ListPrice
    FROM Production.Product
    WHERE ListPrice BETWEEN @Min AND @Max;
END;

-- تمرین ۳
CREATE PROCEDURE usp_CountEmployees
    @Total INT OUTPUT
AS
BEGIN
    SELECT @Total = COUNT(*) FROM HumanResources.Employee;
END;

-- تمرین ۴
CREATE PROCEDURE usp_CheckProductPrice
    @ProductID INT
AS
BEGIN
    DECLARE @Price DECIMAL(10,2);
    SELECT @Price = ListPrice FROM Production.Product WHERE ProductID = @ProductID;

    IF @Price > 1000
        PRINT 'Expensive';
    ELSE
        PRINT 'Cheap';
END;

-- تمرین ۵ (چالشی)
CREATE PROCEDURE usp_SafeDeleteProduct
    @ProductID INT
AS
BEGIN
    BEGIN TRY
        DELETE FROM Production.Product WHERE ProductID = @ProductID;
        PRINT 'Product deleted successfully.';
    END TRY
    BEGIN CATCH
        PRINT 'Error deleting product.';
    END CATCH
END;

📚 جمع‌بندی درس:

در این درس یاد گرفتید چگونه با استفاده از Stored Procedure عملیات تکراری را در پایگاه داده ذخیره و بارها اجرا کنید. همچنین با پارامترهای ورودی، خروجی و مدیریت خطا آشنا شدید. در درس بعد، با موضوع بهینه‌سازی کوئری‌ها و ایندکس‌ها (Indexing) کار خواهیم کرد تا سرعت اجرا و کارایی SQL Server را افزایش دهیم.

0 پاسخ

دیدگاه خود را ثبت کنید

تمایل دارید در گفتگوها شرکت کنید؟
در گفتگو ها شرکت کنید.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *