TSQL में एक नई पंक्ति बदलें


414

मैं TSQL-स्ट्रिंग में एक नया चरित्र बदलना (या निकालना) चाहूंगा। कोई विचार?

स्पष्ट

REPLACE(@string, CHAR(13), '')

बस यह नहीं होगा ...

जवाबों:


841

दरअसल SQL कमांड या स्क्रिप्ट स्ट्रिंग में एक नई लाइन CR, LF या CR + LF में से कोई भी हो सकती है। उन सभी को प्राप्त करने के लिए, आपको कुछ इस तरह की आवश्यकता है:

SELECT REPLACE(REPLACE(@str, CHAR(13), ''), CHAR(10), '')

5
@NielsBrinch जब तक आपके स्ट्रिंग्स में लाइन ब्रेक का एकमात्र प्रकार है तब तक यह ठीक काम करेगा। लेकिन SQL Server तीनों प्रकारों का समर्थन करता है। वास्तव में, यदि आपने कभी सिस्टम संग्रहीत सभी प्रक्रियाओं और स्क्रिप्टेड विचारों को निकाला है, तो आप तीनों के उदाहरण स्वयं Microsoft द्वारा उपयोग किए जा सकते हैं।
RBarryYoung

यह मेरे द्वारा b / c के लिए काम किया इससे पहले कि मैं इस परिवर्तन की प्रतिलिपि बनाऊं और कॉलम डेटा चिपकाने से पाठ के अंत में दो रिक्त स्थान के साथ कर्सर होगा। इस परिवर्तन को कॉपी करने और नोटपैड में चिपकाने के कारण कर्सर को पाठ के अंत में सीधे बैठा था। यह हमारे सामने के अंत में GUI के लिए एक समस्या पैदा कर रहा था GUI नई लाइन चार दिखा रहा था।
एनटी 3

8
यदि स्तंभ डेटा प्रकार पाठ है तो आपको पहले nvarchar पर कास्ट करने की आवश्यकता है, फिर SELPL REPLACE (REPLACE (कास्ट (nvarchar (अधिकतम) के रूप में)), CHAR (13), ''), CHAR (10), '')) की जगह लें)
अकद

1
@Slint हाँ, अच्छी बात है। व्यावहारिक रूप से, क्लाइंट कोड से इसका उपयोग करने के लिए आपको एक कॉलम नाम जोड़ना चाहिए। हालांकि यह सच है कि बहुत बार आप .columns[0]इसके बजाय उपयोग करने से दूर हो सकते हैं ।
RBarryYoung

2
Oracle के संस्करण के लिए मैं उपयोग कर रहा हूं, कथन CHR है, CHAR नहीं। बस अगर कोई ओरेकल से डिबग करने की कोशिश कर रहा है। अन्यथा, बाकी सब कुछ लागू होता है।
सेडोना

143
REPLACE(@string, CHAR(13) + CHAR(10), '')

2
यह वह तरीका था जिसे मैंने पहले आज़माया था, लेकिन यह सभी डेटा के लिए मज़बूती से काम नहीं करता था। @RBryryYoung के ठीक ऊपर है।
मार्क डब्ल्यू डिक्सन

1
धन्यवाद, मुझे अपने काम के लिए इसे थोड़ा संशोधित करना पड़ा, मेरे मामले में इसकी: REPLACE (@string, CHAR (13), ''), CHAR (10), '')
user734028

36

मुझे पार्टी में एक साल की देरी हो सकती है, लेकिन मैं हर दिन प्रश्नों और एमएस-एसक्यूएल पर काम करता हूं, और मैं अंतर्निहित कार्यों LTRIM () और RTRIM () (और हमेशा उन्हें एक साथ कॉल करने के लिए) से थक गया, और 'गंदे' डेटा को न पकड़ने के लिए जिसके अंत में नई सुर्खियाँ थीं, इसलिए मैंने तय किया कि बेहतर TRIM फंक्शन को लागू करने के लिए उच्च समय था। मैं सहकर्मी प्रतिक्रिया का स्वागत करता हूँ!

अस्वीकरण : यह वास्तव में में व्हाट्सएप (टैब, लाइन-फीड, कैरिज-रिटर्न इत्यादि) के विस्तारित रूपों (एकल व्हाट्सएप के साथ) को हटाता है , इसलिए इसे मेरे मूल उत्तर से "CleanAndTrim" नाम दिया गया है। यहाँ विचार यह है कि आपके स्ट्रिंग को इस तरह के अतिरिक्त विशेष व्हाट्सएप पात्रों की आवश्यकता नहीं है, और इसलिए यदि वे सिर / पूंछ पर नहीं होते हैं, तो उन्हें एक सादे स्थान से बदल दिया जाना चाहिए। यदि आप अपने स्ट्रिंग में ऐसे वर्णों को जानबूझकर संग्रहीत करते हैं (कहते हैं, आपके डेटा का कॉलम जो आप इस पर चलने वाले हैं), इसे न करें! इस फ़ंक्शन को सुधारें या अपना स्वयं का लिखें कि शाब्दिक रूप से उन पात्रों को स्ट्रिंग के अंत बिंदु से हटा दें, न कि 'शरीर' से।

ठीक है, अब जबकि अस्वीकरण अपडेट किया गया है, यहां कोड है।

-- =============================================
-- Description: TRIMs a string 'for real' - removes standard whitespace from ends,
-- and replaces ASCII-char's 9-13, which are tab, line-feed, vert tab,
-- form-feed, & carriage-return (respectively), with a whitespace
-- (and then trims that off if it's still at the beginning or end, of course).
-- =============================================
CREATE FUNCTION [fn_CleanAndTrim] (
       @Str nvarchar(max)
)
RETURNS nvarchar(max) AS
BEGIN
       DECLARE @Result nvarchar(max)

       SET @Result = LTRIM(RTRIM(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
              LTRIM(RTRIM(@Str)), CHAR(9), ' '), CHAR(10), ' '), CHAR(11), ' '), CHAR(12), ' '), CHAR(13), ' ')))

       RETURN @Result
END

चीयर्स!

एक और अस्वीकरण : आपका विशिष्ट विंडोज लाइन-ब्रेक सीआर + एलएफ है, इसलिए यदि आपके स्ट्रिंग में वे हैं, तो आप उन्हें "डबल" स्पेस के साथ बदल देंगे।

अद्यतन, 2016 : एक नया संस्करण जो आपकोअपनी पसंद के अन्य पात्रों केसाथ उन विशेष-व्हाट्सएप पात्रों को बदलने का विकल्प देता है! इसमें विंडोज CR + LF पेयरिंग के लिए कमेंट्री और वर्क-अराउंड भी शामिल है, अर्थात एक विशिष्ट प्रतिस्थापन के साथ उस विशिष्ट चार-पेयर को प्रतिस्थापित करता है।

IF OBJECT_ID('dbo.fn_CleanAndTrim') IS NULL
    EXEC ('CREATE FUNCTION dbo.fn_CleanAndTrim () RETURNS INT AS BEGIN RETURN 0 END')
GO
-- =============================================
-- Author: Nate Johnson
-- Source: http://stackoverflow.com/posts/24068265
-- Description: TRIMs a string 'for real' - removes standard whitespace from ends,
-- and replaces ASCII-char's 9-13, which are tab, line-feed, vert tab, form-feed,
-- & carriage-return (respectively), with a whitespace or specified character(s).
-- Option "@PurgeReplaceCharsAtEnds" determines whether or not to remove extra head/tail
-- replacement-chars from the string after doing the initial replacements.
-- This is only truly useful if you're replacing the special-chars with something
-- **OTHER** than a space, because plain LTRIM/RTRIM will have already removed those.
-- =============================================
ALTER FUNCTION dbo.[fn_CleanAndTrim] (
    @Str NVARCHAR(MAX)
    , @ReplaceTabWith NVARCHAR(5) = ' '
    , @ReplaceNewlineWith NVARCHAR(5) = ' '
    , @PurgeReplaceCharsAtEnds BIT = 1
)
RETURNS NVARCHAR(MAX) AS
BEGIN
    DECLARE @Result NVARCHAR(MAX)

    --The main work (trim & initial replacements)
    SET @Result = LTRIM(RTRIM(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
        LTRIM(RTRIM(@Str))  --Basic trim
        , NCHAR(9), @ReplaceTabWith), NCHAR(11), @ReplaceTabWith)   --Replace tab & vertical-tab
        , (NCHAR(13) + NCHAR(10)), @ReplaceNewlineWith) --Replace "Windows" linebreak (CR+LF)
        , NCHAR(10), @ReplaceNewlineWith), NCHAR(12), @ReplaceNewlineWith), NCHAR(13), @ReplaceNewlineWith)))   --Replace other newlines

    --If asked to trim replacement-char's from the ends & they're not both whitespaces
    IF (@PurgeReplaceCharsAtEnds = 1 AND NOT (@ReplaceTabWith = N' ' AND @ReplaceNewlineWith = N' '))
    BEGIN
        --Purge from head of string (beginning)
        WHILE (LEFT(@Result, DATALENGTH(@ReplaceTabWith)/2) = @ReplaceTabWith)
            SET @Result = SUBSTRING(@Result, DATALENGTH(@ReplaceTabWith)/2 + 1, DATALENGTH(@Result)/2)

        WHILE (LEFT(@Result, DATALENGTH(@ReplaceNewlineWith)/2) = @ReplaceNewlineWith)
            SET @Result = SUBSTRING(@Result, DATALENGTH(@ReplaceNewlineWith)/2 + 1, DATALENGTH(@Result)/2)

        --Purge from tail of string (end)
        WHILE (RIGHT(@Result, DATALENGTH(@ReplaceTabWith)/2) = @ReplaceTabWith)
            SET @Result = SUBSTRING(@Result, 1, DATALENGTH(@Result)/2 - DATALENGTH(@ReplaceTabWith)/2)

        WHILE (RIGHT(@Result, DATALENGTH(@ReplaceNewlineWith)/2) = @ReplaceNewlineWith)
            SET @Result = SUBSTRING(@Result, 1, DATALENGTH(@Result)/2 - DATALENGTH(@ReplaceNewlineWith)/2)
    END

    RETURN @Result
END
GO

पिछले उपयोगकर्ता, कृपया परिवर्तन और अस्वीकरण पर ध्यान दें - और मैं उपयोग और उद्देश्य के बारे में शुरुआती मान्यताओं के लिए माफी माँगता हूँ।
नैटज

1
नई अपडेट! परीक्षण के मामले यहां देखे जा सकते हैं: sqlfiddle.com/#/6/585a2/1/0 - SQLFiddle परीक्षण मामलों के मेरे वास्तविक रन पर चोक करने के लिए ऐसा लग रहा था कि इसके बजाय, मैंने "टेस्ट-केस क्वेरी बिल्डर" तालिका बनाई & चलाने के लिए आपको अपने स्वयं के SSMS विंडो में कॉपी-पेस्ट करने के लिए 9 कथन देते हैं (पाठ्यक्रम के स्कीमा बनाने के बाद, यानी फ़ंक्शन और टेस्टस्ट्रीम टेबल)।
नैटज

32

टी-एसक्यूएल में न्यूलाइन को CHAR (13) और CHAR (10) (कैरिज रिटर्न + लाइन फीड) द्वारा दर्शाया गया है। तदनुसार, आप उस पाठ के साथ एक REPLACE स्टेटमेंट बना सकते हैं जिसे आप न्यूलाइन के साथ बदलना चाहते हैं।

REPLACE(MyField, CHAR(13) + CHAR(10), 'something else')

9
यह स्वीकृत उत्तर के समान नहीं है; स्वीकृत उत्तर {13, 10} के किसी भी संयोजन को हटा देता है। यह केवल 13 के विशिष्ट संयोजन को निकालता है। 10. यह विंडोज लाइन एंडिंग के लिए एक अंतर नहीं बनाता है, लेकिन अन्य एन्कोडिंग यहां छूट जाएगी।
एंड्रयू हिल

24

अधिकांश लोग जो चाहते हैं, वह करने के लिए, एक प्लेसहोल्डर बनाएं जो वास्तविक लाइन ब्रेकिंग चरित्र नहीं है। तब आप वास्तव में इसके लिए दृष्टिकोणों को जोड़ सकते हैं:

REPLACE(REPLACE(REPLACE(MyField, CHAR(13) + CHAR(10), 'something else'), CHAR(13), 'something else'), CHAR(10), 'something else')

इस तरह से आप केवल एक बार प्रतिस्थापित करते हैं। का दृष्टिकोण:

REPLACE(REPLACE(MyField, CHAR(13), ''), CHAR(10), '')

बहुत अच्छा काम करता है अगर आप सीआरएलएफ पात्रों से छुटकारा पाना चाहते हैं, लेकिन यदि आप एक प्लेसहोल्डर, जैसे कि
या कुछ और चाहते हैं, तो पहला दृष्टिकोण थोड़ा अधिक सटीक है।


6

यदि आपका कॉलम डेटा प्रकार ' टेक्स्ट ' है, तो आपको एक त्रुटि संदेश मिलेगा

Msg 8116, स्तर 16, राज्य 1, पंक्ति 2 तर्क डेटा प्रकार पाठ प्रतिस्थापित फ़ंक्शन के तर्क 1 के लिए अमान्य है।

इस मामले में आपको पाठ को nvarchar के रूप में डालना होगा और फिर प्रतिस्थापित करना होगा

SELECT REPLACE(REPLACE(cast(@str as nvarchar(max)), CHAR(13), ''), CHAR(10), '')

ठीक है, यह बहुत अच्छा लग रहा है। अब, क्या होगा अगर मैं बदलने की कोशिश कर रहा हूँ "! Crlf" और हाँ जो कि एक चरित्र है! चिंता यह है कि यह स्ट्रिंग के बीच में होता है, क्या मैं इससे दूर हो सकता हूं: SELECT REPLACE (REPLACE (कलाकारों के रूप में nvarchar (MAX)), CHAR (33), CHAR (13), CHAR (10, CHAR) (32), '') या क्या मैंने इसे गलत तरीके से लिखा है? स्ट्रिंग इस तरह दिखता है: रिमोट हमलावरों को सैंडबॉक्स सुरक्षा तंत्र को बायपास करने की अनुमति दें और एक गढ़ी गई वेब साइट टी के माध्यम से विशेषाधिकार प्राप्त करें! इंटरनेट एक्सप्लोरर के साथ हैट पहुंच गया है, फोकस पर! शब्द टी-हेट ... यह मेरी मुसीबत का स्थान है।
bbcompent1

3

यदि आपके पास कोई समस्या है जहाँ आप केवल अनुगामी वर्णों को निकालना चाहते हैं , तो आप यह कोशिश कर सकते हैं:

WHILE EXISTS
(SELECT * FROM @ReportSet WHERE
    ASCII(right(addr_3,1)) = 10
    OR ASCII(right(addr_3,1)) = 13
    OR ASCII(right(addr_3,1)) = 32)
BEGIN
    UPDATE @ReportSet
    SET addr_3 = LEFT(addr_3,LEN(addr_3)-1)
    WHERE 
    ASCII(right(addr_3,1)) = 10
    OR ASCII(right(addr_3,1)) = 13
    OR ASCII(right(addr_3,1)) = 32
END

इससे मुझे एक समस्या का समाधान हुआ जिसमें मुझे पता था कि एक प्रक्रिया ने एक निश्चित संख्या में लाइनों के साथ एक क्षेत्र बनाया है, भले ही वे लाइनें खाली हों। मेरी SSRS रिपोर्ट में स्थान बचाने के लिए, मैंने उन्हें काट दिया।


1

यदि आपके पास sp_helptext का उपयोग करने के साथ खुली प्रक्रिया है, तो बस सभी पाठ को नई sql क्वेरी में कॉपी करें और ctrl + h बटन को दबाने के लिए नियमित अभिव्यक्ति का उपयोग करें और खाली जगह के साथ ^ फ़ील्ड को खोजने के लिए ^ \ n लगाएं। अधिक विस्तार के लिए छवि की जाँच करें। यहां छवि विवरण दर्ज करें


1

@Cerebrus समाधान के लिए: स्ट्रिंग्स "+" के लिए H2 के लिए समर्थित नहीं है। इसलिए:

REPLACE(string, CHAR(13) || CHAR(10), 'replacementString')

0

उत्तर / पूर्व में पोस्ट किया गया जो CHAR (13) CHAR (10) कैरिज रिटर्न को बदलने के लिए सूचित किया गया था:

REPLACE(REPLACE(REPLACE(MyField, CHAR(13) + CHAR(10), 'something else'), CHAR(13), 'something else'), CHAR(10), 'something else')

REPLACE(MyField, CHAR(13) + CHAR(10), 'something else')कोड के हिस्से में कभी नहीं आएगा और उसका अवांछित परिणाम लौटाएगा:

'something else''something else'

और एकल का वांछित परिणाम नहीं:

'something else'

इसके लिए REPLACE स्क्रिप्ट को फिर से लिखना होगा:

REPLACE(REPLACE(REPLACE(MyField, CHAR(10), 'something else'), CHAR(13), 'something else'), CHAR(13) + CHAR(10), 'something else')

चूंकि प्रवाह पहले 1st / Furthest Left REPLACE स्टेटमेंट का परीक्षण करता है, तो विफलता के बाद अगले REPLACE स्टेटमेंट का परीक्षण करना जारी रखेगा।

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