2008-10-10 12 views
35

मैं एक प्रश्न है कि SQL2005 लेकिन SQL2008 करने के लिए डेटाबेस जाने पर ठीक दौड़ा मुझे शीर्षक से त्रुटि देता है।7645 शून्य या रिक्त पूर्ण-पाठ विधेय

समस्या जो कोड है, एक खाली पैरामीटर के साथ कंटेनर, कंटेनस्टबल या FREETEXT पर कॉल है। हालांकि मैं केवल कॉल करने के लिए कोशिश कर रहा हूँ या में शामिल होने जब वहाँ हालांकि मैं इस SQL2008 पर काम करने के लिए किसी भी तरीके को नहीं मिल सकता है इस तरह के

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

या

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

की तरह एक मूल्य है। कोई विचार?

मैं जानता हूँ कि मैं गतिशील एसक्यूएल करते हैं या (एफटी साथ चयन में शामिल हों, बिना एफटी में शामिल होने का चयन दो अलग-अलग मामलों के साथ एक अगर बयान हो सकता है। किसी भी बेहतर समाधान का जो ऐसा करने की आवश्यकता नहीं है?

उत्तर

52

मैं इस सवाल का जवाब मिल गया यह आज के लिए जब अपनी खोज के लिए एसक्यूएल 2008

पास "" को एसक्यूएल 2005 से अपने खुद के डेटाबेस में परिवर्तित करने और @search_term बदल = '' परीक्षण @search_term = '""' एसक्यूएल सर्वर दोहरे उद्धरण चिह्नों पर ध्यान नहीं देगा और एक त्रुटि फेंक नहीं किया जाना है।

उदाहरण के लिए, निम्नलिखित हैं वास्तव में उपयोगकर्ता तालिका में सभी रिकॉर्ड प्रस्तुत करती है:

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)) 

आप नेट का उपयोग कर रहे हैं, तो आप ई डब्ल्यू Bachtal के FullTextSearch वर्ग की एक प्रति हड़पने सकता है। उनकी साइट बहुत जानकारीपूर्ण है: http://ewbi.blogs.com/develops/

+0

धन्यवाद क्रिस, कि यह तय! –

+0

धन्यवाद आदमी ... आपने मेरे घंटे बचाए! शुभ दिन; – effkay

+3

(@SearchTerm = '""') भविष्यवाणी एक अत्यधिक मात्रा में पढ़ने और क्वेरी समय बहिष्कार को कभी-कभी जोड़ती है (जैसा कि व्हाइप्लाशोंनी द्वारा नोट किया गया है) –

14

यह समाधान एसक्यूएल 2008 को मेरे लिए काम नहीं किया जवाब बहुत स्पष्ट लग रहा था और उपयोगी माना गया था, लेकिन मैं 2 एम रिकॉर्ड के साथ एक मेज पर समय बहिष्कार मिलेगा। असल में यह सर्वर को लॉक करता है बस एसएसएमएस में क्वेरी चला रहा है।

यह पसंद नहीं लगता था या जहां खंड में, लेकिन मैं क्वेरी ठीक स्थिति को अलग करने चला सकते हैं।

मैं एक समाधान के रूप में सफलतापूर्वक एक संघ का उपयोग कर समाप्त हो गया।

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

आपकी समस्या शायद इस तथ्य के कारण है कि मेरे पास कोई भी अनुकूलन नहीं है । हाल ही में मुझे यह पता चला है कि जहां ओआरएस के स्थान पर यूनियनों का उपयोग किया जाता है, वहां कई बार तेजी से चलते हैं।तो +1 – NotMe

+0

मेरे पास बहुत सारे LIKEs और कुत्ते की तरह चल रहे वाइल्डकार्ड के साथ एक प्रश्न था। मैंने पूर्ण पाठ अनुक्रमण की कोशिश की जिसने बिल्कुल मदद नहीं की। ORs के बजाय UNIONs का उपयोग करके मेरी क्वेरी ~ 15 सेकंड से 1 से कम हो गई है। +1 !!!! – Melanie

+0

क्या होगा यदि मेरे पास दो तालिकाओं के बीच एक आंतरिक शामिल हो और मैं दो तालिकाओं पर एक पूर्ण पाठ खोज करना चाहता था? इसका मतलब है कि मुझे लगभग 3-4 यूनियनों की आवश्यकता होगी? –

1

एफटीएस और ओआर ऑपरेंड के साथ समस्या एसपी 2 सीयू 4 में तय की गई थी। यदि आप उस स्तर पर या बाद में हैं तो यूनियन के बिना OR स्थिति ठीक चलनी चाहिए। हमने या तो एसपी 2 सीयू 8 और एफटीएस कार्यों के हालिया अपडेट की कोशिश की। इसके अलावा, 3.12 जैसी खोज जो पहले विफल हो जाएंगी, ठीक काम करें।

0

बस डबल कोट्स जोड़ें। आप खाली स्ट्रिंग की जांच कर सकते हैं और फिर इसमें डबल कोट्स जोड़ सकते हैं।

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

ये रहा -

where (@search_term = '""' or (FREETEXT(lst.search_text, @search_term))) 
संबंधित मुद्दे