2008-10-10 20 views
35

SQL2005 üzerinde düzgün çalışan ancak veritabanını SQL2008'e taşıyan bir sorgun var, bana başlıktan hata veriyor.7645 Boş veya boş tam metin yüklemi

Sorun olan bir kod, CONTAINS, CONTAINSTABLE veya FREETEXT boş bir parametre ile yapılan bir çağrıdır. Ancak sadece çağrı çalışıyor yoksa bu SQL2008'deki üzerinde çalışmak için herhangi bir geçici çözüm bulamıyor Ancak böyle

where (@search_term = '' or (FREETEXT(lst.search_text, @search_term))) 

veya

left join containstable (listing_search_text, search_text, @search_term) ftb on l.listing_id = ftb.[key] 
    and len(@search_term) > 0 

gibi bir değer varken katılacağım. Herhangi bir fikir?

ben dinamik SQL yapmak veya (FT katılmak olmadan seçmek katılmak FT ile seçmek iki farklı durumda olan bir eğer deyimi olabilir biliyoruz. Bunu yaparken gerektirmez -Daha iyi bir geçici çözüm?

cevap

52

Yanıt bulundu arama teriminiz için SQL 2008.

Geçiş "" için SQL 2005 kendi veri tabanını dönüştürme ve @search_term değiştirdiğinizde bu günümüze = '' testi @search_term = '""' SQL sunucusu çift tırnak görmezden gelip bir hata atmaz olmak.

Örneğin, aslında olur aşağıdaki Kullanıcılar tablosundaki tüm kayıtları döndürür:

declare @SearchTerm nvarchar(250) 

SET @SearchTerm = '""' 

select UserId, U.Description, U.UserName 
from dbo.Users U 
WHERE ((@SearchTerm = '""') OR CONTAINS((U.Description, U.UserName), @SearchTerm)) 

.NET kullanıyorsanız, E. W. Bachtal en fulltextsearch sınıfının bir kopyasını kapmak olabilir. Onun site çok bilgilendirici: http://ewbi.blogs.com/develops/

+0

Teşekkür Chris, işte bu sabit! –

+0

Teşekkürler adamım ... HOURS'umu kurtardın! İyi günler; – effkay

+3

(@SearchTerm = '""') yüklemi, aşırı miktarda okuma ve ara sıra sorgulama zamanları ekler (whiplashtony ile belirtildiği gibi) –

14

Bu çözüm benim için SQL 2008'de işe yaramadı. Cevap oldukça açık görünüyordu ve yararlı olarak görülüyordu ama 2M kayıtları ile bir tabloya zaman ayırırdım. Aslında, sorguyu sadece SSMS'de çalıştıran bir sunucuyu kilitledi.

Buradaki gibi OR ifadesini beğenmemiş gibi görünüyordu, ancak sorguyu koşullanarak koşulları iyi bir şekilde çalıştırabilirim.

Bir UNION kullanarak bir geçici çözüm olarak başarılı bir şekilde bitti.

declare @SearchTerm nvarchar(250) 

SET @SearchTerm = '""' 

select UserId, U.Description, U.UserName 
from dbo.Users U 
WHERE ((@SearchTerm = '""') 

UNION 

select UserId, U.Description, U.UserName 
from dbo.Users U 
WHERE CONTAINS((U.Description, U.UserName), @SearchTerm)) 
+3

Muhtemelen sahip olduğunuz sorunun hiçbir şekilde optimize edilmemiş olmasından kaynaklanır. . Son zamanlarda, WHERE cümlelerinde OR'lerin yerine UNION'leri kullanarak birkaç kez daha hızlı çalıştığını buldum.Yani +1 – NotMe

+0

Ben tonlarca LIKE ve bir köpek gibi çalışan önde gelen joker karakterler ile bir sorgu vardı. Tam Metin indekslemeyi denedim, hiç yardımcı olmadı. OR'leri yerine UNION'leri kullanmak, sorgum ~ 15 saniyeden 1 + 1'den daha azına çıktı !! – Melanie

+0

İki tablo arasında bir içsel birleşmem olsaydı ve iki tabloda tam metin araması yapmak istedim ne olurdu? Bu yaklaşık 3-4 sendikaya ihtiyacım olacağı anlamına mı geliyor? –

1

FTS ve OR işleneniyle ilgili sorun, SP2 CU4'te giderilmiştir. OR düzeyi, bu seviyede veya daha sonraysanız, UNION'a gerek kalmadan çalışmalıdır. SP2 CU8 ve FTS'nin son güncellemesini şimdi OR ile birlikte denedik. Ayrıca, şimdi başarısız olan 3.12 gibi aramalar da gayet iyi çalışıyor.

0

Sadece ADD çift tırnak. Boş dizeyi kontrol edebilir ve daha sonra çift tırnak işareti ekleyebilirsiniz. İşte

Set @search_term = case when @search_term = '' then '""' else @Address End 

gitmek -

where (@search_term = '""' or (FREETEXT(lst.search_text, @search_term))) 
İlgili konular