TSQL

2009-06-04 14 views
313

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

स्पष्ट

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

बस कर नहीं होगा ...

उत्तर

633

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

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

@NielsBrinch यह तब तक ठीक काम करेगा जब तक कि यह आपके तारों में एकमात्र प्रकार का लाइन ब्रेक न हो। लेकिन एसक्यूएल सर्वर सभी तीन प्रकार का समर्थन करता है। असल में, यदि आपने कभी भी सिस्टम की सभी संग्रहीत प्रक्रियाओं और लिखित दृश्यों को निकाला है, तो आप माइक्रोसॉफ्ट द्वारा उपयोग किए जाने वाले सभी तीनों के उदाहरण पा सकते हैं। – RBarryYoung

+0

यह मेरे लिए यह परिवर्तन प्रतिलिपि बनाने से पहले बी/सी के लिए काम करता था और कॉलम डेटा चिपकाने से पाठ के अंत में दो रिक्त स्थान के साथ कर्सर होगा। इस बदलाव को बदलने और नोटपैड में पेस्ट करने से कर्सर सीधे पाठ के अंत में बैठा था। यह हमारे सामने वाले जीयूआई में बी/सी के लिए एक मुद्दा पैदा कर रहा था, नया लाइन चार दिखा रहा था। – natur3

+4

यदि कॉलम डेटा प्रकार टेक्स्ट है तो आपको पहले nvarchar पर डालना होगा, फिर चयन प्रतिस्थापन (प्रतिस्थापन (कास्ट (@str के रूप में nvarchar (अधिकतम)), CHAR (13), ''), CHAR (10), '') – akd

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

यह वह तरीका था जिसकी मैंने पहली कोशिश की थी, लेकिन यह सभी डेटा के लिए विश्वसनीय रूप से काम नहीं करता था। @RBarryYoung यह ठीक ऊपर है। –

30

T-SQL में Newline CHAR का प्रतिनिधित्व करती है (13) & CHAR (10) (कैरिज रिटर्न + रेखा फ़ीड)। तदनुसार, आप जिस पाठ को आप नई लाइन को प्रतिस्थापित करना चाहते हैं उसके साथ एक रेप्लेस स्टेटमेंट बना सकते हैं।

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

+ 1, मैंने मिच गेहूं को स्वीकार कर लिया क्योंकि वह पहले इसके साथ आया था (घटना हालांकि मेरे समारोह में chr फ़ंक्शन मौजूद नहीं है) – Peter

+1

अरे, कोई समस्या नहीं! सामान्य रूप से मिच चट्टानों। कुछ लोग उसके जितना तेज़ हो सकते हैं। ;-) – Cerebrus

+6

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

20

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

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

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

+1

यह बहुत मदद करता है, मुझे CHAR (10) के साथ कोई समस्या थी और मैंने इसे पहले ही हल कर दिया है –

23

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

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

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 
+0

पिछले उपयोगकर्ता, कृपया परिवर्तन और अस्वीकरण को ध्यान दें - और मैं उपयोग और उद्देश्य के बारे में प्रारंभिक धारणाओं के लिए क्षमा चाहता हूं। – NateJ

+0

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

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 

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

3

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

संदेश 8116, स्तर 16, राज्य 1 मिल जाएगा, पंक्ति 2 तर्क डेटा प्रकार पाठ तर्क 1 के लिए अमान्य है समारोह की जगह।

इस मामले आप nvarchar के रूप में पाठ डाली और उसके बाद की जरूरत है में जगह ले

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

अच्छा चेतावनी! धन्यवाद! –

+0

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

1

आप sp_helptext का उपयोग कर तो बस नई एसक्यूएल क्वेरी और प्रेस Ctrl + H में सभी पाठ की प्रतिलिपि के साथ खुला प्रक्रिया है है, तो बटन को बदलने के लिए नियमित अभिव्यक्ति का उपयोग करें और \ n n जगह फ़ील्ड को रिक्त स्थान से प्रतिस्थापित करें। अधिक जानकारी के लिए छवि की जांच करें। enter image description here

संबंधित मुद्दे