tsql - टीएसक्यूएल में एक नई लाइन बदलें




newline (6)

असल में एसक्यूएल कमांड या स्क्रिप्ट स्ट्रिंग में एक नई लाइन सीआर, एलएफ या सीआर + एलएफ में से कोई भी हो सकती है। उन्हें सब कुछ पाने के लिए, आपको इस तरह कुछ चाहिए:

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

मैं एक TSQL-string में एक न्यूलाइन वर्ण को प्रतिस्थापित (या हटा) करना चाहता हूं। कोई विचार?

स्पष्ट

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

बस यह नहीं करेगा ...


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

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), '')

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


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

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

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

-- =============================================
-- 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 : एक नया संस्करण जो आपको उन विशेष-व्हाइटस्पेस वर्णों को अपनी पसंद के अन्य पात्रों के साथ बदलने का विकल्प देता है! इसमें विंडोज सीआर + एलएफ जोड़ी के लिए टिप्पणी और कार्य-आसपास भी शामिल है, यानी एक विशिष्ट प्रतिस्थापन के साथ उस विशिष्ट चार-जोड़ी को प्रतिस्थापित करता है।

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://.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

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

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

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

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

यदि आपके पास कोई समस्या है जहां आप केवल पीछे वाले वर्णों को हटाना चाहते हैं, तो आप इसे आजमा सकते हैं:

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

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


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




newline