जवाबों:
दरअसल SQL कमांड या स्क्रिप्ट स्ट्रिंग में एक नई लाइन CR, LF या CR + LF में से कोई भी हो सकती है। उन सभी को प्राप्त करने के लिए, आपको कुछ इस तरह की आवश्यकता है:
SELECT REPLACE(REPLACE(@str, CHAR(13), ''), CHAR(10), '')
.columns[0]
इसके बजाय उपयोग करने से दूर हो सकते हैं ।
REPLACE(@string, CHAR(13) + CHAR(10), '')
मुझे पार्टी में एक साल की देरी हो सकती है, लेकिन मैं हर दिन प्रश्नों और एमएस-एसक्यूएल पर काम करता हूं, और मैं अंतर्निहित कार्यों 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
टी-एसक्यूएल में न्यूलाइन को CHAR (13) और CHAR (10) (कैरिज रिटर्न + लाइन फीड) द्वारा दर्शाया गया है। तदनुसार, आप उस पाठ के साथ एक REPLACE स्टेटमेंट बना सकते हैं जिसे आप न्यूलाइन के साथ बदलना चाहते हैं।
REPLACE(MyField, CHAR(13) + CHAR(10), 'something else')
अधिकांश लोग जो चाहते हैं, वह करने के लिए, एक प्लेसहोल्डर बनाएं जो वास्तविक लाइन ब्रेकिंग चरित्र नहीं है। तब आप वास्तव में इसके लिए दृष्टिकोणों को जोड़ सकते हैं:
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), '')
बहुत अच्छा काम करता है अगर आप सीआरएलएफ पात्रों से छुटकारा पाना चाहते हैं, लेकिन यदि आप एक प्लेसहोल्डर, जैसे कि
या कुछ और चाहते हैं, तो पहला दृष्टिकोण थोड़ा अधिक सटीक है।
यदि आपका कॉलम डेटा प्रकार ' टेक्स्ट ' है, तो आपको एक त्रुटि संदेश मिलेगा
Msg 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
इससे मुझे एक समस्या का समाधान हुआ जिसमें मुझे पता था कि एक प्रक्रिया ने एक निश्चित संख्या में लाइनों के साथ एक क्षेत्र बनाया है, भले ही वे लाइनें खाली हों। मेरी SSRS रिपोर्ट में स्थान बचाने के लिए, मैंने उन्हें काट दिया।
यदि आपके पास sp_helptext का उपयोग करने के साथ खुली प्रक्रिया है, तो बस सभी पाठ को नई sql क्वेरी में कॉपी करें और ctrl + h बटन को दबाने के लिए नियमित अभिव्यक्ति का उपयोग करें और खाली जगह के साथ ^ फ़ील्ड को खोजने के लिए ^ \ n लगाएं। अधिक विस्तार के लिए छवि की जाँच करें। यहां छवि विवरण दर्ज करें
@Cerebrus समाधान के लिए: स्ट्रिंग्स "+" के लिए H2 के लिए समर्थित नहीं है। इसलिए:
REPLACE(string, CHAR(13) || CHAR(10), 'replacementString')
उत्तर / पूर्व में पोस्ट किया गया जो 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 स्टेटमेंट का परीक्षण करना जारी रखेगा।