Nasıl T-SQL saklı yordam isteğe bağlı parametreler kullanabilir miyim?
Bir saklı yordam bir tablo ile bir arama yapmak için yaratıyorum. Tümü isteğe bağlı olan birçok farklı arama alanları var. Bir şekilde bu işi saklı bir yordam oluşturmak için var mı? Hadi dört alanları ile bir tablo var: İD, Ad, Soyad ve Unvan. Böyle bir şey yapabilirim:
CREATE PROCEDURE spDoSearch
@FirstName varchar(25) = null,
@LastName varchar(25) = null,
@Title varchar(25) = null
AS
BEGIN
SELECT ID, FirstName, LastName, Title
FROM tblUsers
WHERE
FirstName = ISNULL(@FirstName, FirstName) AND
LastName = ISNULL(@LastName, LastName) AND
Title = ISNULL(@Title, Title)
END
Bu tür işleri. Ancak Ad, Soyad veya Ünvanı BOŞ yere kayıtları yok sayar. Eğer Başlık arama parametreleri belirtilirse değil Başlık BOŞ Ad ve Soyadı aynı olduğu kayıt eklemek istiyorum. Muhtemelen dinamik SQL ile bunu yapabileceğimi biliyorum ama bunu önlemek istiyorum. Herhangi bir fikir?
Teşekkürler, Corey
CEVAP
Dinamik olarak değişen arar verilen parametrelere dayalı karmaşık bir konudur ve bunu yaparken bile sadece çok hafif bir fark ile başka bir yere bir şekilde, büyük bir performans etkileri olabilir. Anahtar dizin kullanımı, kompakt kodu görmezden, kodu tekrar iyi bir sorgu yürütme planı (dizin kullanmak) yapmak gerekir endişesi göz ardı etmektir.
Bu okuyun ve bütün yöntemleri deneyin. En iyi yöntem, parametre, veri, şema ve gerçek kullanım bağlıdır:
Dynamic Search Conditions in T-SQL by by Erland Sommarskog
The Curse and Blessings of Dynamic SQL by Erland Sommarskog
Eğer uygun SQL Server 2008 sürümü (SQL 2008 SP1 CU5 (10.0.2746) ve üstü) varsa, bu küçük bir hile aslında bir dizin kullanmak için kullanabilirsiniz:
Ekle OPTION (RECOMPILE)
üzerine sorgu, see Erland's article, ve SQL Server gidermek OR
içinde (@LastName IS NULL OR LastName= @LastName)
Daha önce sorgu planı göre oluşturulan çalışma zamanı değerleri yerel değişkenler ve bir dizin kullanılabilir.
Bu herhangi bir SQL Server sürümü (uygun sonuçlar döndürmek için çalışır, ancak yalnızca SQL(YENİDEN) SEÇENEĞİ vardır 2008 SP1 CU5 (10.0.2746) ve daha sonra. SEÇENEĞİ(YENİDEN) sorgunuzu yeniden derleyin, ADSL listelenen geçerli koşarken göre en iyi performansı verecek yerel değişkenler, zaman değerlerini yeniden derleyin. Eğer SQL Server'ın bu sürümünde 2008, sadece o satırı devre dışı bırakın.
CREATE PROCEDURE spDoSearch
@FirstName varchar(25) = null,
@LastName varchar(25) = null,
@Title varchar(25) = null
AS
BEGIN
SELECT ID, FirstName, LastName, Title
FROM tblUsers
WHERE
(@FirstName IS NULL OR (FirstName = @FirstName))
AND (@LastName IS NULL OR (LastName = @LastName ))
AND (@Title IS NULL OR (Title = @Title ))
OPTION (RECOMPILE) ---<<<<use if on for SQL 2008 SP1 CU5 (10.0.2746) and later
END
Nasıl C isteğe bağlı parametreler kull...
Nasıl DbContext kullanmak için.Veritab...
C# 4.0: varsayılan değeri isteğe bağlı...
Nasıl kayıtları saklı bir yordam taraf...
Nasıl gerçek bir saklı yordam satırı b...