2008-11-03 15 views
65

में उपयोग करना सुरक्षित हो, मैं SQL सर्वर की संग्रहीत प्रक्रिया में स्ट्रिंग से कैसे बचूं ताकि LIKE अभिव्यक्ति में उपयोग करना सुरक्षित हो।SQL सर्वर में एक स्ट्रिंग से बचें ताकि LIKE अभिव्यक्ति

मैं बहुत की तरह एक NVARCHAR चर राशि मान लीजिए:

declare @myString NVARCHAR(100); 

और मैं एक LIKE अभिव्यक्ति में उपयोग करना चाहते हैं:

... WHERE ... LIKE '%' + @myString + '%'; 

मैं स्ट्रिंग कैसे बच है (खासतौर पर, अक्षर हैं जो टी-एसक्यूएल में LIKE पैटर्न मिलान, उदाहरण के लिए % या ?) के अर्थपूर्ण हैं, ताकि इस तरीके से उपयोग करना सुरक्षित हो?

उदाहरण के लिए, दिए गए:

@myString = 'aa%bb' 

मैं चाहता हूँ:

WHERE ... LIKE '%' + @somehowEscapedMyString + '%' 

मैच के लिए 'aa%bb', 'caa%bbc' नहीं बल्कि 'aaxbb' या 'caaxbb'

+0

आपने अपनी प्रोग्रामिंग भाषा –

+0

में नहीं डाली है उसकी प्रोग्रामिंग भाषा टी-एसक्यूएल है। –

उत्तर

81

एक LIKE अभिव्यक्ति में विशेष वर्णों से बचने के लिए आप उन्हें बचने वाले चरित्र के साथ उपसर्ग करते हैं। आप ESCAPE कीवर्ड के साथ कौन से भागने वाले चार का उपयोग करने के लिए चुनते हैं। (MSDN Ref)

उदाहरण के लिए इस% प्रतीक पलायन, \ भागने चार के रूप में उपयोग करते हुए:

select * from table where myfield like '%15\% off%' ESCAPE '\' 

आप क्या पात्रों अपने स्ट्रिंग में हो जाएगा पता नहीं है, और आप नहीं करना चाहते हैं उन्हें वाइल्डकार्ड के रूप में करते हैं, आपको पलायन की चार के साथ सभी वाइल्डकार्ड वर्णों उपसर्ग कर सकते हैं जैसे:

set @myString = replace( 
       replace( 
       replace( 
       replace(@myString 
       , '\', '\\') 
       , '%', '\%') 
       , '_', '\_') 
       , '[', '\[') 

(ध्यान दें कि आप भी अपने भागने चार से बचने के लिए है, और यह सुनिश्चित करें कि आंतरिक replace ताकि आप बच नहीं है बनाने के अन्यसे जोड़े गएबयान)। तो फिर तुम कुछ इस तरह उपयोग कर सकते हैं:

select * from table where myfield like '%' + @myString + '%' ESCAPE '\' 

इसके अलावा अपने @myString चर के लिए अधिक स्थान आवंटित करने के लिए के रूप में यह स्ट्रिंग प्रतिस्थापन के साथ लंबे समय तक हो जाएगा याद है।

+0

वर्तमान में मैं http://stackoverflow.com/questions/13861004/escaping-the-escape-character-does-not-work-sql-like-operator में उल्लिखित दृष्टिकोण का उपयोग कर रहा हूं क्या आपको उस कोड के साथ कोई कमी दिखाई दे रही है? – Lijo

+2

@ लिजो, यह ठीक है। वह उत्तर सी # में भाग रहा है जबकि उपर्युक्त उत्तर एसक्यूएल में करता है क्योंकि यह सी #-स्पेसिफिक नहीं है। किसी भी तरह से परिणाम समान है: अपनी खोज स्ट्रिंग में किसी भी विशेष वर्ण से बचें और अपने LIKE कथन में ESCAPE कीवर्ड का उपयोग करें। – Rory

+0

मुझे लगता है कि आपको एक सिंगल कोट से बचने की भी आवश्यकता है (इसे दो सिंगल कोट्स के साथ बदलना, '\' 'के साथ नहीं)। –

5

आप भागने वाले चरित्र को निर्दिष्ट करते हैं। यहां प्रलेखन:
http://msdn.microsoft.com/en-us/library/ms179859.aspx

+1

मैं ऐसी चीज़ की इच्छा कर रहा था जो पहले से ही बताता है कि एक LIKE अभिव्यक्ति में क्या बचने की आवश्यकता है। –

+0

उत्तर ने सुझाव दिया है कि आप अपना खुद का बचाना चरित्र निर्दिष्ट करें ताकि "सार्थक" वर्ण अब और सार्थक नहीं होंगे। – Goran

3

क्या आप स्ट्रिंग्स को देखना चाहते हैं जिसमें एक बच निकलने वाला चरित्र शामिल है? उदाहरण के लिए आप यह चाहते हैं:

select * from table where myfield like '%10%%'. 

जहां आप 10% के साथ सभी फ़ील्ड खोजना चाहते हैं? यदि ऐसा है तो आप बचपन के चरित्र को निर्दिष्ट करने और वाइल्डकार्ड चरित्र से बचने के लिए ESCAPE खंड का उपयोग कर सकते हैं।

select * from table where myfield like '%10!%%' ESCAPE '!' 
+0

मैंने एक उदाहरण जोड़ा जो मैं सवाल करना चाहता हूं। –

16

ऐसी ही समस्या थी (NHibernate का उपयोग करके, इसलिए ESCAPE कीवर्ड बहुत कठिन होता) और इसे ब्रैकेट वर्णों का उपयोग करके हल किया गया।तो अपने नमूना

WHERE ... LIKE '%aa[%]bb%' 

बन जाएगा आप सबूत की जरूरत है:

create table test (field nvarchar(100)) 
go 
insert test values ('abcdef%hijklm') 
insert test values ('abcdefghijklm') 
go 
select * from test where field like 'abcdef[%]hijklm' 
go 
+0

यह सबसे अच्छा जवाब है। भागने पर भरोसा नहीं करता है और सभी तारों के लिए काम करता है। – John

+0

मुझे लगता है कि यह पूछताछ करने वाले के लिए सबसे सरल और निकटतम है। यह नहीं कहना है कि कुछ मामलों में ईएससीएपीई उपयोगी नहीं है। – bitoolean

12

बजाय सभी दिया है कि आप एक प्रमुख वाइल्डकार्ड का उपयोग कर रहे पैटर्न वाक्य रचना में विशेष महत्व है कि एक स्ट्रिंग में वर्णों से बचने पैटर्न में यह करने के लिए बस तेज और आसान है।

SELECT * 
FROM YourTable 
WHERE CHARINDEX(@myString , YourColumn) > 0 

मामलों में आप किसी प्रमुख वाइल्डकार्ड दृष्टिकोण से ऊपर उपयोग नहीं कर रहे में हालांकि परहेज किया जाना चाहिए के रूप में यह YourColumn पर एक सूचकांक का उपयोग नहीं कर सकते हैं।

साथ ही ऐसे मामलों में जहां इष्टतम कार्य योजना लागू करके मिलान पंक्तियों की संख्या अनुमान बेहतर हो सकता है जब वर्ग कोष्ठक वाक्य रचना से बचने जब both CHARINDEX और the ESCAPE keyword की तुलना के साथ LIKE का उपयोग कर के अनुसार अलग अलग होंगे में

+0

उत्कृष्ट! लेकिन क्या होगा यदि कोई अग्रणी वाइल्ड कार्ड नहीं था? – Colin

+1

@ कोलिन - यदि कोई अग्रणी वाइल्डकार्ड नहीं था और लक्ष्य ** स्ट्रिंग में कहीं और ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** {1] विशेष वर्णों के उत्तर से बचने के लिए अभी भी एक विशेष मूल्य से शुरू होने वाले मूल्यों की तलाश में एक क्वेरी के लिए उपयोगी हो सकता है, हालांकि 'LIKE' उस मामले में एक इंडेक्स का उपयोग कर सकता है लेकिन 'CHARINDEX' नहीं कर सकता है। –

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