SQL सर्वर में वर्ण से बच


95

मैं बच चरित्र के साथ उद्धरण का उपयोग करना चाहता हूं। मैं कैसे कर सकता हूँ?

मुझे SQL सर्वर में त्रुटि मिली है

वर्ण पंक्ति के बाद खुला उद्धरण चिह्न।

मैं एक varcharचर में SQL क्वेरी लिख रहा हूँ, लेकिन मुझे वह त्रुटि मिली है:

वर्ण पंक्ति के बाद खुला उद्धरण चिह्न।

मैं एक एस्केप चार के रूप में उद्धरण चिह्न का उपयोग करना चाहता हूं।


4
क्या आप कृपया हमें क्वेरी दिखा सकते हैं ??
marc_s

जवाबों:


78

बचने के लिए 'आपको पहले एक और लगाने की जरूरत है:''

दूसरे उत्तर से पता चलता है कि इस तरह एकल उद्धरण से बचना संभव है:

select 'it''s escaped'

परिणाम होगा

it's escaped

यदि आप SQL को VARCHAR में (यानी डायनामिक SQL) निष्पादित करने के लिए संक्षिप्त कर रहे हैं, तो मैं SQL को पैरामीटर करने की सलाह दूंगा। यह एसक्यूएल इंजेक्शन प्लस के खिलाफ गार्ड की मदद करने का लाभ है इसका मतलब है कि आपको इस तरह के उद्धरणों से बचने के बारे में चिंता करने की ज़रूरत नहीं है (जो आप उद्धरणों को दोगुना करके करते हैं)।

जैसे करने के बजाय

DECLARE @SQL NVARCHAR(1000)
SET @SQL = 'SELECT * FROM MyTable WHERE Field1 = ''AAA'''
EXECUTE(@SQL)

इसे इस्तेमाल करे:

DECLARE @SQL NVARCHAR(1000)
SET @SQL = 'SELECT * FROM MyTable WHERE Field1 = @Field1'
EXECUTE sp_executesql @SQL, N'@Field1 VARCHAR(10)', 'AAA'

30
यह स्वीकृत उत्तर क्यों है? यह सवाल का जवाब नहीं है।
पीटर मूर

3
@PeterMoore या तो ओपी ने मेरे उत्तर के पहले भाग (उद्धरणों को दोगुना करते हुए, नीचे दिए गए अन्य उत्तरों के अनुसार) का उपयोग किया होगा, या एक स्ट्रिंग चर में SQL क्वेरी बनाने के लिए अनुशंसित पसंदीदा दृष्टिकोण का उपयोग किया होगा - पैरामीटर का उपयोग करने के लिए एसक्यूएल। किसी भी तरह से, दोनों सवाल का जवाब हैं
AdaTheDev

यह सवाल का जवाब नहीं है। कभी-कभी उपयोगकर्ता को ODBC कनेक्शन की आवश्यकता होती है जिसका अर्थ है कि आप केवल शुद्ध SQL का उपयोग कर सकते हैं।
टोनी

अधिक स्पष्ट और बेहतर ढंग से फिट किए गए उत्तर का
संपादन

122

आप इस तरह उद्धरण से बच सकते हैं:

select 'it''s escaped'

परिणाम होगा

it's escaped

इसका उत्तर होना चाहिए।
टोनी

45

आप अपने भागने के चरित्र को परिभाषित कर सकते हैं, लेकिन आप इसे केवल एक LIKEखंड के साथ उपयोग कर सकते हैं ।

उदाहरण:

SELECT columns FROM table
WHERE column LIKE '%\%%' ESCAPE '\'

यहाँ यह %पूरे स्ट्रिंग में खोज करेगा और यह है कि कोई कैसे ESCAPEपहचानकर्ता का उपयोग कर सकता है SQL Server


21

तुम बस प्रतिस्थापित करने की आवश्यकता 'के साथ ''अपने स्ट्रिंग के अंदर

SELECT colA, colB, colC
FROM tableD
WHERE colA = 'John''s Mobile'

यदि आप REPLACE(@name, '''', '''''')SQL को गतिशील रूप से जनरेट कर रहे हैं, तो आप इसका उपयोग भी कर सकते हैं

यदि आप किसी स्टेटमेंट के अंदर बचना चाहते हैं तो आपको ESCAPE सिंटैक्स का उपयोग करने की आवश्यकता है

यह भी उल्लेखनीय है कि यदि आप इस पर विचार नहीं करते हैं तो आप अपने आप को SQL इंजेक्शन के हमलों के लिए खुला छोड़ रहे हैं। Google पर अधिक जानकारी या: http://it.toolbox.com/wiki/index.php/How_do_I_escape_single_quotes_in_SQL_queries%3F


और अभी तक dugokontov या RichardPianka द्वारा जवाब किसी भी समान -1 नहीं है?
Seph

@MichaelMunsey अपने लिए इसे आज़माएं: select 'त्रुटि लौटाता है Unclosed quotation mark after the character string ''। मेरे जवाब में कहीं भी मैं "केवल दो का उपयोग करता हूं ', यह निश्चित नहीं है कि मेरा वोटों के साथ एकमात्र जवाब क्यों है।
सितम्बर

12

MSSQL में एस्केपिंग उद्धरण एक दोहरे उद्धरण द्वारा किया जाता है, इसलिए ''या एक क्रमशः ""बच गए 'और ", एक का उत्पादन करेगा ।


0

आप **\**मूल्य से पहले चरित्र का उपयोग कर सकते हैं जैसे आप बच निकलना चाहते हैं insert into msglog(recipient) values('Mr. O\'riely') select * from msglog where recipient = 'Mr. O\'riely'


0

यदि आप एक चर में उपयोगकर्ता इनपुट से बचना चाहते हैं तो आप नीचे SQL में कर सकते हैं

  Set @userinput = replace(@userinput,'''','''''')

@Userinput अब एक उद्धरण के हर रोष के लिए एक अतिरिक्त एकल उद्धरण के साथ बच जाएगा



-2

कोड को पढ़ने में आसान रखने के लिए, आप []स्ट्रिंग युक्त 'या इसके विपरीत उद्धरण के लिए वर्ग कोष्ठक का उपयोग कर सकते हैं ।


यह गलत है। ब्रैकेट फ़ील्ड, टेबल या स्कीमा नामों में अवैध वर्णों पर काम करते हैं।
जेमी मार्शल

हाँ, आप सही, इसके ऑब्जेक्ट नामों के लिए, स्ट्रिंग सामग्री नहीं। मुझे प्रश्न गलत पढ़ना चाहिए।
बेन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.