Veritabanı programlama
Dinamik SQL ve sp_executesql
Değerleri koddan ayır.
Kavramı anlayalım
Dinamik SQL, sorgu yapısının çalışma anında değişmesidir. Kullanıcı değerini sorgu metnine birleştirmek yerine sp_executesql parametresi olarak ilet. Parametreler tablo veya sütun adı yerine geçmez; nesne adları için sabit bir izin listesi gerekir. QUOTENAME bir tanımlayıcıyı sınırlar, erişim yetkisi vermez.
Parametreli çağrı plan tekrar kullanımını kolaylaştırabilir; her sorgunun optimal planı yine veri dağılımına bağlıdır. N öneki Unicode metni korur. Metin boyutunu nvarchar(max), parametre tipini gerçek sütun tipiyle uyumlu seç. sp_executesql kullanmak tek başına güvenli sayılmaz: zararlı metni daha önce birleştirmişsen risk devam eder. İzin listesi dışındaki yapısal seçenekleri reddet.
Dinamik filtreler ve izinli sıralama seçenekleri için.
Parametre yerine metin birleştirip sonunda sp_executesql çağırmak.
Aynı konu. Üç farklı derinlik.
EXEC sys.sp_executesql N'SELECT ProductId, ProductName FROM lab.Product;';Sabit SQL metni yürütülür.
Bu sayfa SQL çalıştırmaz. Örnekleri indirilebilir SqlStudioLab veritabanında, SSMS’de uygula. Geçici tablo örneklerini yeniden çalıştırırken yalnız ilgili #tabloyu temizle. VIEW, procedure ve function örnekleri lab’da kalıcı nesne oluşturur; üretim bağlantısı kullanma.
Önce kendin dene.
Minimum fiyatı parametre olarak alan dinamik sorgu yaz.
Çözümü ve açıklamasını göster
EXEC sys.sp_executesql N'SELECT ProductName, Price FROM lab.Product WHERE Price >= @Min;', N'@Min decimal(10,2)', @Min = 1000;Fiyat filtre değeri metinden ayrı tutulur.