SORU
5 AĞUSTOS 2010, PERŞEMBE


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
5 AĞUSTOS 2010, PERŞEMBE


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

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Helder Barreto

    Helder Barre

    22 Mayıs 2006
  • Joseph Hayhoe

    Joseph Hayho

    20 Mayıs 2010
  • The Bad Tutorials

    The Bad Tuto

    6 EKİM 2009