2009-09-17 7 views
34

में सिंगल कोट्स को बदलें, मेरे पास सिंगल कोट्स को प्रतिस्थापित करने के लिए SQL सर्वर में यह फ़ंक्शन है।SQL सर्वर

लेकिन जब मैं एक एकल उद्धरण सम्मिलित यह Replace(@strip,''','')) पर एक त्रुटि फेंकता है:

Create Function [dbo].[fn_stripsingleQuote] 
    (@strStrip varchar(Max)) 
    returns varchar 
as 
begin 
    declare @CleanString varchar(Max) 
    SET @var=(Replace(@strip,'','')) 

    return @var 
end 

उत्तर

81

आप इस प्रकार अपने एकल उद्धरण अप दोगुना करने की जरूरत है), आपने चर के नामों को भी भ्रमित कर दिया है: आप @ क्लेनस्ट्रिंग और @स्ट्रस्ट्रिप की बजाय @var और @strip का उपयोग कर रहे हैं ...

+0

द्वारा निहित संग्रहीत प्रोसेस के लिए मुझे एक ही समस्या का सामना करना पड़ रहा है लेकिन आपकी तकनीक का उपयोग करके मुझे ** सिंटैक्स त्रुटि, अप्रत्याशित ' '' (T_CONSTANT_ENCAPSED_STRING) '** –

0

स्ट्रिपिंग/प्रतिस्थापन/उपयोगकर्ता इनपुट (input sanitation) से एकल उद्धरण की scaping, किया जा सकता है एसक्यूएल से पहले बयान डेटाबेस तक पहुंचता है।

+0

यह भी आवेषण पर किया जा सकता है, इसलिए व्यवस्थापक न केवल डीबीए –

+0

पर है, इसका मतलब है कि एसक्यूएल इंजेक्शन के लिए खुला स्पॉक्स ठीक है। मैं इस निहितार्थ से सहमत नहीं हूं। –

+0

क्या होगा यदि सर्वर उदाहरण के साथ बातचीत करने वाला कोडर जानबूझकर एसक्यूएल इंजेक्शन हमला बनाने की कोशिश कर रहा है? टी-एसक्यूएल/डाटाबेस एंड पर कुछ सत्यापन/स्वच्छता भी होनी चाहिए, विशेष रूप से @JohnDhom – mpag

19

REPLACE(@strip,'''','')

SQL दो उद्धरण का उपयोग करता है एक स्ट्रिंग में एक का प्रतिनिधित्व करने के लिए प्रयास करें।

1

एक भी बोली के साथ एकल उद्धरण से बचने का प्रयास करें: (दोहरे उद्धरण चिह्नों का उपयोग करके

REPLACE(@strip, '''', '') 
0

उद्धरण से बचने के लिए की आवश्यकता होगी, इसके अलावा:

Replace(@strip, '''', '') 
13

यदि आपको वास्तव में सिंगल को पूरी तरह से बाहर करना होगा ई उद्धरण आप यह कर सकते हैं:

Replace(@strip, '''', '') 

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

तो '' के साथ 'कोड में आप यह करते हैं चाहते हैं बदलने के लिए:

Replace(@strip, '''', '''''') 
बेशक

... कुछ स्थितियों में आप जब डेटाबेस से क्वेरी यदि आप पैरामीटर का उपयोग पूरी तरह से यह करने के लिए होने से बचने कर सकते हैं । मान लें कि आप .NET अनुप्रयोग से डेटाबेस से पूछताछ कर रहे हैं, तो आप क्वेरी के लिए SqlCommand पैरामीटर को फ़ीड करने के लिए SqlParameter class का उपयोग करेंगे और इस एकल कोट व्यवसाय को स्वचालित रूप से ख्याल रखा जाएगा। यह आमतौर पर पसंदीदा तरीका है क्योंकि SQL पैरामीटर SQL injection हमलों को रोकने में भी मदद करेंगे।

4

ऐसा लगता है कि आप QUOTENAME कार्यक्षमता को डुप्लिकेट करने का प्रयास कर रहे हैं। इस अंतर्निर्मित फ़ंक्शन का उपयोग डिलीमीटर जोड़ने और तारों के अंदर डिलीमीटरों से ठीक से बचने के लिए किया जा सकता है और एकल ' और डबल " उद्धरण के रूप में उद्धरण, साथ ही ब्रैकेट [ और ] दोनों को पहचानता है।

+0

QUOTENAME टी-एसक्यूएल पहचानकर्ताओं के लिए है। दुर्भाग्य से डेटा के लिए उपयुक्त नहीं है। – Suncat2000

0

मुझे लगता है कि यह है कि के लिए सबसे छोटा एसक्यूएल बयान है:

CREATE FUNCTION [dbo].[fn_stripsingleQuote] (@strStrip varchar(Max)) 
    RETURNS varchar(Max) 
AS 
BEGIN  
    RETURN (Replace(@strStrip ,'''','')) 
END 

मुझे आशा है कि इस मदद करता है!

0

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

उदाहरण

लिए
SET QUOTED_IDENTIFIER OFF; 

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

SET QUOTED_IDENTIFIER OFF; 
+0

ऐसा लगता है कि ओपी समझ में नहीं आता है कि सिंगल कोट्स के अंदर एक सिंगल कोट क्यों नहीं लगाता है। जिस तरह से पहचानकर्ता उद्धृत किए जाते हैं उसे बदलने के लिए इसे ठीक करने की संभावना नहीं है। इसके अलावा, यह सवाल 3 साल पुराना है ... –

+0

ओपी ने कहा कि उनके समारोह का उद्देश्य एक ही उद्धरण को प्रतिस्थापित करना था। मेरा समाधान वास्तव में उस समारोह के लिए एक वैध दृष्टिकोण है। साथ ही, यदि अन्य उपयोगकर्ताओं को लगता है कि इस प्रश्न का उत्तर REPLACE() के साथ मदद नहीं करता है, जैसा कि मेरे मामले में, यह समाधान वास्तव में उपयोगी हो सकता है। संक्षेप में, मेरा उत्तर दूसरों के लिए सहायक हो सकता है, यदि आवश्यक नहीं तो ओपी। और प्रश्न की उम्र क्या करती है यदि यह समुदाय के लिए सहायक हो? –

1

आप चार (39)

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

मैं एक अजीब विसंगति है कि यहाँ भी लागू होता है में भाग इस्तेमाल कर सकते हैं। Google एपीआई का उपयोग करना और एक्सएमएल प्रारूप में जवाब प्राप्त करना, यह सिंगल कोट्स के कारण एक्सएमएल डेटा प्रकार में कनवर्ट करने में असफल रहा।

बदलें (@Strip, '' '', '')

काम नहीं कर रहा था क्योंकि एकल उद्धरण ASCII वर्ण 146 के बजाय 39 था तो मैं प्रयोग किया है:

बदलें (@Strip, चार (146), '')

जो नियमित सिंगल कोट्स चार (3 9) और किसी अन्य विशेष चरित्र के लिए भी काम करता है।

+0

कोई ASCII चरित्र 146 नहीं है। विस्तारित एएससीआईआई अन्य पात्रों, ग्राफिक्स और प्रतीकों की तरह अन्य पात्रों को परिभाषित करता है। 'char (146) 'उस चरित्र सेट में लैटिन Æ से मेल खाता है। अगर वह अभिव्यक्ति काम करती है, तो यह किसी भी चीज के अनुरूप नहीं है जो समझ में आता है। – Suncat2000