Saklı yordamlar oluştur

Tamamlandı

Saklı yordamlar , iş mantığını kapsüllemek ve uygulama performansını geliştirmek için SQL Server'daki en güçlü araçlardan biridir. Saklı yordamlar oluşturduğunuzda, sunucuda yürütülen yeniden kullanılabilir kod blokları oluşturarak ağ trafiğini azaltır ve veri erişim mantığını merkezileştirirsiniz.

Saklı yordamları anlamak

Saklı yordam, SQL Server'ın tek bir birim olarak depolayıp yürüttüğü T-SQL deyimlerinin derlenmiş bir koleksiyonudur. Her seferinde sunucuya gönderdiğiniz planlanmamış sorgulardan farklı olarak, saklı yordamlar önceden derlenir ve iyileştirilir, bu da sonraki yürütmelerde daha hızlı çalıştıkları anlamına gelir.

Karmaşık iş mantığını kapsüllemek, veri doğrulama kurallarını zorunlu kılmak ve uygulamaların veritabanınızla nasıl etkileşim kuracaklarını denetlemek için saklı yordamları kullanırsınız. Örneğin, doğrudan tablo erişimine izin vermek yerine, verileri değiştirmeden önce girişi doğrulayan, iş kuralları uygulayan ve değişiklikleri günlüğe kaydeden saklı yordamlar oluşturabilirsiniz.

Performans avantajları, sorgu planı önbelleğinden kaynaklanır. Planlanmamış sorgularda SQL Server'ın her sorguyu ayrıştırması ve her seferinde iyileştirmesi gerekir. Saklı yordamlarla, yürütme planı ilk çalıştırmadan sonra önbelleğe alınır ve yinelenen işlemler için ek yük azalır.

Temel saklı yordamlar oluşturun

Saklı yordam oluşturma işlemi, CREATE PROCEDURE deyiminin ardından T-SQL mantığınızla başlar. Yordam adını, netliği ve performansı geliştiren şemaya uygun bir tanımlayıcı kullanarak belirtirsiniz.

CREATE PROCEDURE dbo.GetCustomerOrders
AS
BEGIN
    SET NOCOUNT ON;
    
    SELECT 
        OrderID,
        CustomerID,
        OrderDate,
        TotalAmount
    FROM dbo.Orders
    ORDER BY OrderDate DESC;
END

SET NOCOUNT ON deyimi, etkilenen satır sayısıyla ilgili iletinin istemciye gönderilmesini engeller. Bu, özellikle yordam birden çok deyim yürüttüğünde ağ trafiğini azaltır ve performansı artırır.

Prosedür oluşturduğunuzda, prosedür gövdesini açıkça tanımlamak için BEGIN ve END anahtar sözcüklerini kullanın. Bu, kodunuzu daha okunabilir hale getirir ve daha sonra mantık eklerken veya değiştirirken hataları önlemeye yardımcı olur.

Parametrelerle çalışma

Parametreler, depolanmış prosedürleri esnek ve yeniden kullanılabilir hale getirir. Çağıran uygulamadan değerleri kabul etmek için giriş parametreleri ve çağırana değerleri geri döndürmek için çıkış parametreleri tanımlarsınız.

Giriş parametreleri@ simgesini ve ardından bir parametre adı ve veri türü kullanır. Parametreleri isteğe bağlı hale getirmek için varsayılan değerler sağlayabilirsiniz:

CREATE PROCEDURE dbo.GetCustomerOrdersByDate
    @CustomerID int,
    @StartDate datetime = NULL,
    @EndDate datetime = NULL
AS
BEGIN
    SET NOCOUNT ON;
    
    SELECT 
        OrderID,
        OrderDate,
        TotalAmount
    FROM dbo.Orders
    WHERE CustomerID = @CustomerID
        AND (@StartDate IS NULL OR OrderDate >= @StartDate)
        AND (@EndDate IS NULL OR OrderDate <= @EndDate)
    ORDER BY OrderDate DESC;
END

Çıkış parametreleri, değerleri çağıran uygulamaya döndürmenizi sağlar. Bunları anahtar sözcüğünü OUTPUT kullanarak tanımlarsınız:

CREATE PROCEDURE dbo.CalculateOrderTotal
    @OrderID int,
    @TotalAmount decimal(10,2) OUTPUT
AS
BEGIN
    SET NOCOUNT ON;
    
    SELECT @TotalAmount = SUM(Quantity * UnitPrice)
    FROM dbo.OrderDetails
    WHERE OrderID = @OrderID;
    
    RETURN 0;
END

Çıkış parametreleriyle bir yordam çağırdığınızda, değeri almak için bir değişken bildirmeniz ve deyiminde OUTPUTEXECUTE anahtar sözcüğünü kullanmanız gerekir.

Hata işlemeyi uygulama

Sağlam saklı yordamlar, beklenmeyen koşulları yönetmek ve veri bütünlüğünü korumak için hata işlemeyi içerir. Diğer programlama dillerinde özel durum işlemeye benzer şekilde çalışan blokları kullanarak TRY...CATCH hata işleme uygularsınız.

CREATE PROCEDURE dbo.InsertCustomerOrder
    @CustomerID int,
    @OrderDate datetime,
    @TotalAmount decimal(10,2)
AS
BEGIN
    SET NOCOUNT ON;
    
    BEGIN TRY
        BEGIN TRANSACTION;
        
        -- Validate customer exists
        IF NOT EXISTS (SELECT 1 FROM dbo.Customers WHERE CustomerID = @CustomerID)
        BEGIN
            RAISERROR('Customer does not exist.', 16, 1);
        END
        
        -- Insert order
        INSERT INTO dbo.Orders (CustomerID, OrderDate, TotalAmount)
        VALUES (@CustomerID, @OrderDate, @TotalAmount);
        
        COMMIT TRANSACTION;
        RETURN 0;
    END TRY
    BEGIN CATCH
        IF @@TRANCOUNT > 0
            ROLLBACK TRANSACTION;
        
        DECLARE @ErrorMessage nvarchar(4000) = ERROR_MESSAGE();
        DECLARE @ErrorSeverity int = ERROR_SEVERITY();
        DECLARE @ErrorState int = ERROR_STATE();
        
        RAISERROR(@ErrorMessage, @ErrorSeverity, @ErrorState);
        RETURN -1;
    END CATCH
END

Blok TRY ana mantığınızı içerirken CATCH , blok oluşan hataları işler. Hata ayrıntılarını yakalamak ve bunları çağıran uygulamaya aktarmak için ERROR_MESSAGE(), ERROR_SEVERITY() ve ERROR_STATE() gibi sistem işlevlerini kullanabilirsiniz.

Bloktaki CATCH işlemleri geri almadan önce @@TRANCOUNT her zaman denetleyin. Bu, işlem zaten tamamlandıysa veya hiç başlatılmadıysa hataları önler.

En iyi yöntemleri uygulama

Saklı yordamlar oluştururken uygulanan en iyi yöntemlerin uygulanması bunların sürdürülebilir, güvenli ve performanslı olmasını sağlar.

Şemaya uygun adları kullanma

Tüm nesneler için şema nitelenmiş adları kullanın. Bu, belirsizliği ortadan kaldırır ve şema çözümleme ek yükünü önleyerek performansı artırır:

-- Good
SELECT * FROM dbo.Orders

-- Avoid
SELECT * FROM Orders

Parametre doğrulamayı uygulama

Yönteminizin başında parametre doğrulamasını gerçekleştirin. Hatalı verileri işlemek yerine girişler geçersiz olduğunda hızlı başarısız olur:

IF @CustomerID IS NULL OR @CustomerID <= 0
BEGIN
    RAISERROR('CustomerID must be a positive integer.', 16, 1);
    RETURN -1;
END

Kaçının SELECT *

Üretim kodunda bundan kaçının SELECT *. Tablo yapıları değiştiğinde sorunları önlemek ve sorgu performansını geliştirmek için sütunları açıkça listeleyin:

-- Good
SELECT OrderID, CustomerID, OrderDate FROM dbo.Orders

-- Avoid
SELECT * FROM dbo.Orders

Anlamlı adlar kullanma

Yordamın ne yaptığını açıklayan anlamlı adlar kullanın. İşlemi gösteren bir fiil ekleyin (Get, Insert, Update, Delete, Calculate):

CREATE PROCEDURE dbo.GetActiveCustomersByRegion
CREATE PROCEDURE dbo.UpdateCustomerAddress
CREATE PROCEDURE dbo.DeleteExpiredOrders

Ön ekten sp_ kaçının

Saklı yordamlarınız için sp_ ön ekini kullanmayın. SQL Server, master veritabanında depolanan sistem yordamları için bu ön eki ayırır. sp_ bir prosedür adlandırdığınızda, SQL Server geçerli veritabanını denetlemeden önce master arar ve bu, gereksiz ek yük ekler.

-- Good
CREATE PROCEDURE dbo.GetCustomerOrders

-- Avoid
CREATE PROCEDURE dbo.sp_GetCustomerOrders

Bu uygulamaları temel almak, ekibinizin anlayabileceği, koruyabileceği ve üretim ortamlarında güvenilir bir şekilde çalışacak saklı yordamlar oluşturmanıza yardımcı olur.