Ana içeriğe geç
Kesit SQL
Orta · T-SQL (SQL Server)

Saklı yordam derinliği: varsayılan parametre, iç içe çağrı, INSERT EXEC

Gerçek yordamlar birbirini çağırır, sonuçları tabloya alır ve hata anında temiz çıkar.

Uygulamada aç, 7 alıştırmayı çözÜcretsiz, hesap gerekmez, kurulum yok.

Bu sayfa dersin okuma sürümüdür. Metin bir kutuyu çalıştırmanı ya da adıma geçmeni söylüyorsa dersi uygulamada aç.

Varsayılan parametre

Temel yazım için Saklı yordamlar dersine bak. Varsayılan değer verilen parametre çağrıda atlanabilir. NULL varsayılan ve (@p IS NULL OR sutun = @p), isteğe bağlı filtrenin yaygın kalıbıdır; ama parametre koklama riski taşır.

CREATE PROCEDURE dbo.usp_Urunler @kategori NVARCHAR(50) = NULL, @en_az DECIMAL(12, 2) = 0 AS
BEGIN
  SET NOCOUNT ON;
  SELECT name, price FROM products WHERE (@kategori IS NULL OR category = @kategori) AND price >= @en_az ORDER BY price DESC, name;
END;
GO
EXEC dbo.usp_Urunler @kategori = N'Kitap';
EXEC dbo.usp_Urunler @en_az = 5000;

İç içe çağrı

Bir yordam diğerini çağırabilir. @@NESTLEVEL kaçıncı derinlikte olduğunu verir. Sınır 32'dir; aşılınca Msg 217 alınır, bu motor da aynı hatayı verir.

CREATE PROCEDURE dbo.usp_Ic AS BEGIN SELECT @@NESTLEVEL AS derinlik; END;
GO
CREATE PROCEDURE dbo.usp_Dis AS BEGIN EXEC dbo.usp_Ic; END;
GO
EXEC dbo.usp_Dis;

INSERT ... EXEC

Yordamın sonuç kümesini tabloya alır. Sütun sayısı ve sırası uymalı. Sınırı: yordam birden çok sonuç kümesi döndürüyorsa işler karışır ve iç içe INSERT EXEC gerçek SQL Server'da yasaktır. Satır içi tablo değerli işlev çoğu zaman daha temizdir.

CREATE PROCEDURE dbo.usp_Kitap AS BEGIN SELECT product_id, price FROM products WHERE category = N'Kitap'; END;
GO
CREATE TABLE #kitap (product_id INT, price DECIMAL(12, 2));
INSERT INTO #kitap EXEC dbo.usp_Kitap;
SELECT COUNT(*) AS adet, MAX(price) AS en_pahali FROM #kitap;

WITH RECOMPILE ve TVP

ÖzellikNe yaparBu motorda
WITH RECOMPILEYordam her çağrıda yeniden derlenir, plan önbelleğe yazılmazYazım kabul edilir, plan etkisi görülmez
Tablo değerli parametreCREATE TYPE ... AS TABLE, READONLY ile çok satır geçirmeÇalışmaz: CREATE TYPE reddedilir

Yordamda güvenli işlem

Hata yönetimi kalıbı için Hata yönetimi ileri dersine bak: SET XACT_ABORT ON, TRY/CATCH, geri al, yeniden fırlat.

Alıştırmalara geç (7)