2011-06-02 17 views
8

मैं अपनी क्वेरी करने के लिए टेक्स्ट बॉक्स से इनपुट स्ट्रिंग को टोकननाइज़ करने में सक्षम होना चाहता हूं। उदाहरण: उपयोगकर्ता टेक्स्ट बॉक्स में "abc xyz 123" में प्रवेश करता है। मैं यह करना चाहता हूं:ट्रांजैक्ट-एसक्यूएल: मैं स्ट्रिंग को टोकन कैसे बना सकता हूं?

SELECT * FROM database WHERE Name contains "abc" AND "xyz" AND "123" 
-- as opposed to containing "abc xyz 123" 
-- please ignore my sql syntax, I am an absolute beginner 

धन्यवाद।

उत्तर

6

हो जाएगा एक स्ट्रिंग विभाजन समारोह (उदाहरण के लिए this one की तरह,) का उपयोग करना, आप कुछ इस तरह हो सकता है:

SELECT t.* 
FROM atable t 
    INNER JOIN dbo.Split(@UserInput, ' ') s ON t.Name LIKE '%' + s.Data + '%' 
1

एक संभावित समाधान यह है कि आप स्ट्रिंग लेते हैं और इसे अपने टोकन में विभाजित करते हैं और प्रत्येक टोकन इसे एक temp तालिका में डालने के लिए और फिर अपनी खोज तालिका में temp तालिका में शामिल हो जाते हैं और शामिल होने में '%' + tokenColumn + '%' आपके सभी पंक्तियां अपने टोकन

यहाँ से एक मान प्राप्त करने के लिए स्ट्रिंग बंटवारे का एक उदाहरण है: http://blogs.microsoft.co.il/blogs/itai/archive/2009/02/01/t-sql-split-function.aspx

0

आप इस लक्ष्य को हासिल करने के लिए गतिशील एसक्यूएल का उपयोग कर सकते हैं:

declare @InputText varchar(8000) 
set @InputText = 'abc xyz 123' 

declare @CommorText varchar(8000) 
set @CommorText = 'SELECT * FROM table WHERE Name like ''%' + replace(@InputText, ' ', '%'' or Name like ''%') + '%'''; 

-- @CommorText would look like this at this point 
-- SELECT * FROM table WHERE Name like '%abc%' or Name like '%xyz%' or Name like '%123%' 

execute(@CommorText) 

[संपादित करें] एविटस की टिप्पणी के जवाब में:

सबसे सही समाधान नहीं है। हालांकि, अगर किसी को प्रवेश करती है 'ड्रॉप तालिका Test1', क्वेरी SELECT * FROM Test1 WHERE Name like '%drop%' or Name like '%table%' or Name like '%Test1%'

+1

हाँ जब तक कोई व्यक्ति पैरामीटर में प्रवेश नहीं करता है जैसे "- अपना डाटाबेस ड्रॉप करें" या कोई अन्य एसक्यूएल इंजेक्शन हमला – Avitus

0

मैं एक ही है सवाल। मुझे अंतरिक्ष चरित्र द्वारा विभाजित करने के लिए तारों की 1,200 पंक्तियां मिलीं। मेरा जवाब ओपन ऑफिस कैल्क जैसे स्प्रैडशीट का उपयोग करना है। फिर यदि आपको उन्हें डीबी में रखना है, तो आप सूत्र के माध्यम से सम्मिलित स्क्रिप्ट उत्पन्न कर सकते हैं। यह एसक्यूएल का उपयोग नहीं करेगा लेकिन यह आपकी तरह की समस्या को हल कर सकता है।

संबंधित मुद्दे