मैं SQL सर्वर में किसी एक उद्धरण से कैसे बचूँ?


956

मैं 9 insertमें एक तालिका में कुछ पाठ डेटा की कोशिश कर रहा हूँ SQL Server

पाठ में एक एकल उद्धरण (') शामिल है।

मैं उससे कैसे बचूँ?

मैंने दो एकल उद्धरणों का उपयोग करने की कोशिश की, लेकिन इसने मुझे कुछ त्रुटियाँ दीं।

जैसे। insert into my_table values('hi, my name''s tim.');


30
"इसने मुझे कुछ त्रुटियां दीं" - ये त्रुटियां क्या थीं?
llamaoo7

हां, क्योंकि MSSQL में एकल उद्धरण डालने का सही तरीका उन्हें दोगुना करना है। जो उदाहरण आप हमें दिखाते हैं वह काम करने वाला होना चाहिए। आप इस SQL ​​क्वेरी को किस भाषा के साथ बनाते हैं? या यह SQL सर्वर प्रबंधन स्टूडियो में है?
MaxiWheat

जवाबों:


1387

जैसे आपने हमें अपने उदाहरण में दिखाया है, वैसे ही एकल उद्धरण उन्हें दोगुना करके बच जाते हैं । निम्न SQL इस कार्यक्षमता को दिखाता है। मैंने इसे SQL Server 2008 पर परीक्षण किया:

DECLARE @my_table TABLE (
    [value] VARCHAR(200)
)

INSERT INTO @my_table VALUES ('hi, my name''s tim.')

SELECT * FROM @my_table

परिणाम

value
==================
hi, my name's tim.

16
मैं अपनी समस्या को ठीक करने के लिए गलत जगह देख रहा था। यह एक चरित्र से बचने का मुद्दा नहीं था। मेरा मुद्दा यह था कि डेटा की लंबाई सीमा से अधिक थी। मुझे आश्वस्त करने के लिए धन्यवाद कि एकल उद्धरण का उपयोग करते हुए दो बार चरित्र से बचने का सही तरीका है।
टिम_विनिल

इसलिए, अगर मेरे पास एक पाठ है जिसमें 10k शब्द हैं तो यह आवश्यक होगा कि मैं अपने सभी पाठ को बदल दूं?
विनीसियस लीमा

3
@ViniciusLima: संक्षिप्त उत्तर हाँ है। डेटा को संग्रहीत करने के लिए आप जिस तकनीक का उपयोग करने जा रहे हैं, उसके आधार पर यह निश्चित रूप से बदल जाएगा। यदि आप ORM का उपयोग कर रहे हैं तो यह आपके लिए करेगा। यदि आप अपनी SQL कमांड मैन्युअल रूप से बना रहे हैं, तो आप भाषा के "तैयार स्टेटमेंट" कार्यक्षमता का उपयोग करना चाहते हैं। यदि आप इसे प्रबंधन स्टूडियो में कर रहे हैं तो आपको प्रतिस्थापित करना होगा।
C

1
यानी एक के लिए दो सिंगल कोट्स। [[’] => [’]
उज्जवल सिंह

67

यदि आपके एकल उद्धरण को किसी अन्य एकल उद्धरण से बचाना आपके लिए काम नहीं कर रहा है (जैसे कि यह मेरे हाल के REPLACE()प्रश्नों में से एक के लिए नहीं है ), तो आप SET QUOTED_IDENTIFIER OFFअपनी क्वेरी से पहले, फिर SET QUOTED_IDENTIFIER ONअपनी क्वेरी के बाद उपयोग कर सकते हैं ।

उदाहरण के लिए

SET QUOTED_IDENTIFIER OFF;

UPDATE TABLE SET NAME = REPLACE(NAME, "'S", "S");

SET QUOTED_IDENTIFIER ON;
-- set OFF then ON again

2
आम तौर पर मैं दोगुना दृष्टिकोण का उपयोग करता हूं, लेकिन जहां मैं गतिशील एसक्यूएल उत्पन्न कर रहा था जो तब कई सर्वरों और डेटाबेस में चला गया था, इस समाधान ने मेरे लिए काम किया जबकि दोहरीकरण एक विशिष्ट मामले में नहीं था। इसके लिए धन्यवाद!
रिचर्ड मॉस

गणना किए गए कॉलम पर विचार और अनुक्रमित करते समय सावधान रहें या आपको एक त्रुटि मिल सकती है। stackoverflow.com/questions/9235527/…
डेटागोड

@ रीचर्ड मॉस, +1। आपके साथ भी यही दृश्य। दोगुना दृष्टिकोण प्रारंभिक समाधान है। कई सर्वरों में गतिशील एसक्यूएल जैसे जटिल प्रश्नों के लिए, यह काम करेगा, अप्रोच दोगुना हो सकता है
एडगर एलन बाय्रोन

48

कैसा रहेगा:

insert into my_table values('hi, my name'+char(39)+'s tim.')

18
इसके बजाय चार (39) का उपयोग करें
Iswanto San

17

बोली को दोगुना करने के लिए काम करना चाहिए था, इसलिए यह अजीब है कि यह आपके लिए काम नहीं करता था; हालांकि, एक विकल्प स्ट्रिंग के चारों ओर एकल वाले के बजाय दोहरे उद्धरण वर्णों का उपयोग कर रहा है। अर्थात,

insert into my_table values("hi, my name's tim.");


4
क्या होगा यदि पाठ में एकल और दोहरे दोनों उद्धरण हों? इसके अलावा, केवल फ़ील्ड नामों के लिए दोहरे उद्धरण आरक्षित नहीं हैं?
लाजोस मेस्सरोस

11

इसके आसपास काम करने के 2 तरीके:


आपके लिए 'बस इसे स्ट्रिंग में दोगुना कर सकते हैं, जैसे select 'I''m happpy'- मिलेगा:I'm happy


किसी भी तरह के किसी भी ट्रान्सफ़ॉर्मर के बारे में आप निश्चित नहीं हैं: sql सर्वर में आप किसी भी चार्ट का यूनिकोड प्राप्त कर सकते हैं select unicode(':')(आप नंबर को रख सकते हैं)

तो यह मामला आप भी कर सकते हैं select 'I'+nchar(39)+'m happpy'


6

इसके अलावा एक और बात का ध्यान रखना चाहिए कि क्या यह वास्तव में एक क्लासिक ASCII '(ASCII 27) या यूनिकोड 2019 के रूप में संग्रहीत है या नहीं (जो समान दिखता है, लेकिन समान नहीं)।

यह आवेषण पर एक बड़ा सौदा नहीं है, लेकिन इसका मतलब यह हो सकता है कि दुनिया चयन और अपडेट पर निर्भर हो।
यदि यह यूनिकोड मान है तो 'WHERE क्लॉज (जैसे जहाँ blah =' वर्कर्स कम्प ') से बचकर वापस आएँगे, जैसा कि आप खोज रहे हैं वैसा नहीं है यदि' 'वर्कर कम्प' 'वास्तव में है यूनिकोड मूल्य।

यदि आपका क्लाइंट एप्लिकेशन फ्री-की का समर्थन करता है, साथ ही कॉपी और पेस्ट आधारित इनपुट का समर्थन करता है, तो यह कुछ पंक्तियों में यूनिकोड और दूसरों में ASCII हो सकता है!

इस बात की पुष्टि करने का एक सरल तरीका यह है कि किसी प्रकार की खुली हुई क्वेरी को करें जो आपके द्वारा खोजे जा रहे मूल्य को वापस लाएगा, और फिर कॉपी करें और नोटपैड ++ या कुछ अन्य यूनिकोड सहायक संपादक में पेस्ट करें।

एससीआई मूल्य और यूनिकोड के बीच की अलग-अलग उपस्थिति आंखों के लिए स्पष्ट होनी चाहिए, लेकिन यदि आप गुदा की ओर झुकते हैं, तो यह एक हेक्स संपादक में 27 (एस्की) या 92 (यूनिकोड) के रूप में दिखाई देगा।


4

हम में से बहुत से लोग जानते हैं कि सिंगल क्वोट्स से बचने का लोकप्रिय तरीका उन्हें नीचे की तरह आसानी से डब करना है।

PRINT 'It''s me, Arul.';

एकल उद्धरण विधि दोहरीकरण

हम एकल उद्धरण से बचने के कुछ अन्य वैकल्पिक तरीकों पर ध्यान देने जा रहे हैं।

1.UNICODE अक्षर

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

PRINT 'Hi,it'+CHAR(39)+'s Arul.';
PRINT 'Helo,it'+NCHAR(39)+'s Arul.';

अद्वितीय चरित्र

2.QUOTED_IDENTIFIER

एक और सरल और सबसे अच्छा वैकल्पिक उपाय है QUOTED_IDENTIFIER का उपयोग करना। जब QUOTED_IDENTIFIER को ऑफ़ पर सेट किया जाता है, तो स्ट्रिंग्स को दोहरे उद्धरण चिह्नों में संलग्न किया जा सकता है। इस परिदृश्य में, हमें एक उद्धरण से बचने की आवश्यकता नहीं है। तो, एकल उद्धरण के साथ बहुत सारे स्ट्रिंग मानों का उपयोग करते समय यह तरीका बहुत मददगार होगा। INSERT / UPDATE लिपियों की इतनी सारी पंक्तियों का उपयोग करते समय यह बहुत मददगार होगा, जहाँ एकल उद्धरण वाले कॉलम मान होते हैं।

SET QUOTED_IDENTIFIER OFF;
PRINT "It's Arul."
SET QUOTED_IDENTIFIER ON;

QUOTE_IDENTIFIER

निष्कर्ष

उपर्युक्त विधियां AZURE और ऑन प्रिमाइसेस दोनों पर लागू होती हैं।


1

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

SELECT ''''

परिणाम एक ही उद्धरण होगा। गतिशील SQL :) बनाने के लिए बहुत उपयोगी हो सकता है। यहां छवि विवरण दर्ज करें


0

यह काम करना चाहिए

DECLARE @singleQuote CHAR 
SET @singleQuote =  CHAR(39)

insert into my_table values('hi, my name'+ @singleQuote +'s tim.')

0

बस कुछ भी डालने से पहले 'डालें'। यह sqlServer में एक भागने चरित्र की तरह होगा

उदाहरण: जब आपके पास एक फ़ील्ड है, तो मैं ठीक हूँ । आप ऐसा कर सकते हैं: my_table SET row = '' मैं ठीक हूं। '' अपडेट करें;


क्या यह ठीक नहीं है कि ओपी ने क्या किया, और जैसा कि शीर्ष-मतदान जवाब पहले से ही कहते हैं? संभवतः त्रुटि का कोई अन्य स्रोत रहा होगा।
माइकल मैकसिल

-2

यह काम करना चाहिए: एक बैक स्लैश का उपयोग करें और एक डबल उद्धरण डालें

"UPDATE my_table SET row =\"hi, my name's tim.\";

क्या मतलब? आप कह रहे हैं कि PRINT \"hi, my name's tim.\";SSMS में काम करने जा रहा है? यह बिल्कुल काम नहीं करता है और किसी ने भी कभी नहीं बताया कि यह काम करता है।
मोहम्मद मुसावी

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