Saklı yordamlar oluştur
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.