SQL सर्वर VARCHAR / NVARCHAR स्ट्रिंग में एक पंक्ति विराम कैसे सम्मिलित करें


560

मैंने इस विषय पर पूछे गए किसी भी समान प्रश्न को नहीं देखा था, और मुझे इस पर शोध करना था कि मैं अभी काम कर रहा हूं। सोचा था कि मैं इसके लिए जवाब पोस्ट करूँगा अगर किसी और के पास भी यही सवाल था।


8
अपने आउटपुट का परीक्षण करने के लिए, यदि SSMS का उपयोग करना सुनिश्चित करें कि प्रतिलिपि पर कॉपी CR / LF का विकल्प दिया गया है या सहेजा गया है, अन्यथा सभी चिपके हुए परिणाम लाइन फ़ीड को ढीला कर देंगे। आप इसे सेटिंग्स, क्वेरी परिणाम, sql सर्वर, ग्रिड पर परिणाम पर पाते हैं।
स्टेफानोस ज़िल्लिस

1
@StefanosZilellis और प्रभावी बदलाव के लिए सेटिंग परिवर्तन के लिए एक नई क्वेरी विंडो खोलना सुनिश्चित करें।
डॉन चेडल

जवाबों:


594

char(13)है CR। डॉस के लिए- / विंडोज-स्टाइल CRLFलाइनब्रेक, आप चाहते हैं char(13)+char(10), जैसे:

'This is line 1.' + CHAR(13)+CHAR(10) + 'This is line 2.'

28
चार (13) + चार (10) मेरे लिए खिड़कियों में काम नहीं किया। मैंने सिर्फ चार (10)
निमा

6
@ नीमा: कुछ एप्लिकेशन एक नई लाइन दिखाने के लिए एक या दूसरे या दोनों का उपयोग करेंगे, हालांकि कई एप्लिकेशन जो आप इस टेक्स्ट को आउटपुट कर सकते हैं, दोनों को एक नई लाइन का संकेत देने के लिए उत्तराधिकार में दिखाई देने की आवश्यकता होगी। मुझे दोनों का उपयोग करना सुरक्षित लगता है। आप यहाँ सूचीबद्ध कर सकते हैं कि आपका कौन सा ऐप इसके लिए काम नहीं करता है। मैं CHAR (0x0D) + CHAR (0x0A) हेक्साडेसिमल मानों को स्वयं पसंद करता हूं, लेकिन प्रत्येक को अपना।
माइकेटीवी

2
मैंने इस पद्धति का सफलतापूर्वक उपयोग किया, लेकिन इसके साथ एक समस्या में भाग गया: एक बार जब आप 480 से अधिक हो जाते हैं +, तो SQL सर्वर शिकायत करना शुरू कर देगा कि आपकी क्वेरी बहुत गहराई से नेस्टेड है। मेरा समाधान इसके बजाय रोब कूपर के जवाब का उपयोग करने के लिए था, लेकिन बहुत लंबे और अधिक अस्पष्ट टोकन के साथ।
मार्कस डाउनिंग

5
\ R \ n प्रदान करने का अर्थ होगा कि नियमित अभिव्यक्ति मौजूद है और उपयोगकर्ता उन्हें समझने और उपयोग करने में सक्षम हैं।
wwmbes

10
@HBlackorby \ r और \ n पूर्ववर्ती Java- कुछ भी दशकों में C के उपयोग के साथ; और पायथन, पीएचपी, रूबी, सी ++, सी #, आदि में मानक हैं ...
Uueerdo

285

मुझे यहाँ उत्तर मिला: http://blog.sqlauthority.com/2007/08/22/sql-server-t-sql-script-to-insert-carriage-return-and-new-line-in-in-in कोड /

आप बस स्ट्रिंग को सम्‍मिलित करें और CHAR(13)जहां आप अपनी लाइन तोड़ना चाहते हैं, वहां डालें ।

उदाहरण:

DECLARE @text NVARCHAR(100)
SET @text = 'This is line 1.' + CHAR(13) + 'This is line 2.'
SELECT @text

यह निम्नलिखित प्रिंट करता है:

यह लाइन 1 है।
यह लाइन 2 है।


11
अद्यतन: इसे भूल जाओ। यह सिर्फ ठीक सम्मिलित करता है। यह प्रबंधन स्टूडियो है जो दृश्यता के लिए रिक्त स्थान के साथ टैब और न्यूलाइन्स को प्रतिस्थापित करता है
डैनियल डोलज़

12
ऐसा लगता है कि आपको इस परिणाम को प्राप्त करने के लिए PRINT @text का उपयोग करने की आवश्यकता है बल्कि चयन करें।
QMaster

3
BTW: आप NCHAR(0x1234)एक यूनिकोड वर्ण प्राप्त करने के लिए भी उपयोग कर सकते हैं । लाइन ब्रेक लगाने के लिए आवश्यक नहीं है, लेकिन यदि कोई यूनिकोड वर्णों को सम्मिलित / खोज सकता है, तो वह काम आ सकता है।
पॉल ग्रूके

3
SQL सर्वर 2016 में, मैं केवल इसे दो पंक्तियों को प्रिंट करता हूं यदि मैं printइसके बजाय उपयोग करता हूं select, जैसे:DECLARE @text NVARCHAR(100); SET @text = 'This is line 1.' + CHAR(13) + 'This is line 2.'; print @text;
devinbost

7
अपने आउटपुट का परीक्षण करने के लिए, यदि SSMS का उपयोग करना सुनिश्चित करें कि प्रतिलिपि पर कॉपी CR / LF का विकल्प दिया गया है या सहेजा गया है, अन्यथा सभी चिपके हुए परिणाम लाइन फ़ीड को ढीला कर देंगे। आप इसे सेटिंग्स, क्वेरी परिणाम, sql सर्वर, ग्रिड पर परिणाम पर पाते हैं।
डॉन चेडल

81

ऐसा करने का एक और तरीका इस प्रकार है:

INSERT CRLF SELECT 'fox 
jumped'

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

string str = @"INSERT CRLF SELECT 'fox 
    jumped'"

14
दूसरे शब्दों में, एसक्यूएल भाषा का सिंटैक्स केवल स्ट्रिंग्स के शाब्दिक अर्थों में कच्ची पंक्ति फ़ीड की अनुमति देता है। यह मेरे द्वारा आजमाए गए सभी इंजनों में काम करता है (SQL Server, Oracle, MySQL, PostgreSQL और SQLite)।
अलवारो गोंजालेज

कभी-कभी यह बेतरतीब ढंग से काम करता है यदि आप इसे संग्रहीत प्रक्रियाओं में उपयोग करते हैं
DaFi4

25

SSMS में इसे चलाएं, यह दिखाता है कि SQL में रेखा कैसे टूटती है, यह स्ट्रिंग मानों का हिस्सा बन जाता है, जो लाइनों को फैलाते हैं:

PRINT 'Line 1
Line 2
Line 3'
PRINT ''

PRINT 'How long is a blank line feed?'
PRINT LEN('
')
PRINT ''

PRINT 'What are the ASCII values?'
PRINT ASCII(SUBSTRING('
',1,1))
PRINT ASCII(SUBSTRING('
',2,1))

परिणाम:
लाइन 1
लाइन 2
लाइन 3

रिक्त पंक्ति फ़ीड कब तक है?
2

ASCII मान क्या हैं?
१३
१०

या यदि आप अपने तार को एक पंक्ति पर निर्दिष्ट करते हैं (लगभग!) तो आप REPLACE()इस तरह से काम कर सकते हैं (वैकल्पिक CHAR(13)+CHAR(10)रूप से प्रतिस्थापन के रूप में उपयोग करें ):

PRINT REPLACE('Line 1`Line 2`Line 3','`','
')

16

Google के बाद ...

वेबसाइट से कोड लेना:

CREATE TABLE CRLF
    (
        col1 VARCHAR(1000)
    )

INSERT CRLF SELECT 'The quick brown@'
INSERT CRLF SELECT 'fox @jumped'
INSERT CRLF SELECT '@over the '
INSERT CRLF SELECT 'log@'

SELECT col1 FROM CRLF

Returns:

col1
-----------------
The quick brown@
fox @jumped
@over the
log@

(4 row(s) affected)


UPDATE CRLF
SET col1 = REPLACE(col1, '@', CHAR(13))

ऐसा लगता है कि इसे CHAR (13) के साथ प्लेसहोल्डर की जगह देकर किया जा सकता है

अच्छा सवाल है, यह खुद कभी नहीं किया :)


4
लेकिन अगर पाठ में एक ईमेल पता है? "jon@bob.com" "jon bob.com" बन गया (ई-ड्रेस में एक नई रूपरेखा के साथ)
intrepidis

4
@ क्रिसनश तब एक अलग प्लेसहोल्डर (जैसे "|", "~", या कई अक्षरों का उपयोग करें, ""! #!)। : नीचे इस सवाल का जवाब देखें stackoverflow.com/a/31179/179311
ब्रैडलीस 7

1
"CONCAT (CHAR (13), CHAR (10))" ("\ r \ n") विंडोज़ पर्यावरण के लिए बेहतर होगा, जो मुझे लगता है कि मामला है (SQL Server) cs.toronto.edu/~krueger -csc209h/ tut / line-
endings.html

12

मुझे यहां इसलिए मिला क्योंकि मुझे चिंता थी कि C # स्ट्रिंग्स में निर्दिष्ट cr-lfs जो SQl सर्वर प्रबंधन क्वेरी क्वेरी प्रतिक्रियाओं में नहीं दिखाए जा रहे थे।

यह पता चला है, वे वहां हैं, लेकिन प्रदर्शित नहीं किए जा रहे हैं।

Cr-lfs को "देखने" के लिए, प्रिंट स्टेटमेंट का उपयोग करें जैसे:

declare @tmp varchar(500)    
select @tmp = msgbody from emailssentlog where id=6769;
print @tmp

4

यहां एक C # फ़ंक्शन है जो एक टेक्स्ट लाइन को मौजूदा टेक्स्ट ब्लॉब के लिए प्रस्तुत करता है, जिसे CRLFs द्वारा सीमांकित किया गया है, और टी-एसक्यूएल अभिव्यक्ति को INSERTया UPDATEऑपरेशन के लिए उपयुक्त देता है । इसमें हमारी कुछ मालिकाना त्रुटि को संभाल लिया गया है, लेकिन एक बार जब आप इसे निकाल देते हैं, तो यह मददगार हो सकता है - मुझे उम्मीद है।

/// <summary>
/// Generate a SQL string value expression suitable for INSERT/UPDATE operations that prepends
/// the specified line to an existing block of text, assumed to have \r\n delimiters, and
/// truncate at a maximum length.
/// </summary>
/// <param name="sNewLine">Single text line to be prepended to existing text</param>
/// <param name="sOrigLines">Current text value; assumed to be CRLF-delimited</param>
/// <param name="iMaxLen">Integer field length</param>
/// <returns>String: SQL string expression suitable for INSERT/UPDATE operations.  Empty on error.</returns>
private string PrependCommentLine(string sNewLine, String sOrigLines, int iMaxLen)
{
    String fn = MethodBase.GetCurrentMethod().Name;

    try
    {
        String [] line_array = sOrigLines.Split("\r\n".ToCharArray());
        List<string> orig_lines = new List<string>();
        foreach(String orig_line in line_array) 
        { 
            if (!String.IsNullOrEmpty(orig_line))  
            {  
                orig_lines.Add(orig_line);    
            }
        } // end foreach(original line)

        String final_comments = "'" + sNewLine + "' + CHAR(13) + CHAR(10) ";
        int cum_length = sNewLine.Length + 2;
        foreach(String orig_line in orig_lines)
        {
            String curline = orig_line;
            if (cum_length >= iMaxLen) break;                // stop appending if we're already over
            if ((cum_length+orig_line.Length+2)>=iMaxLen)    // If this one will push us over, truncate and warn:
            {
                Util.HandleAppErr(this, fn, "Truncating comments: " + orig_line);
                curline = orig_line.Substring(0, iMaxLen - (cum_length + 3));
            }
            final_comments += " + '" + curline + "' + CHAR(13) + CHAR(10) \r\n";
            cum_length += orig_line.Length + 2;
        } // end foreach(second pass on original lines)

        return(final_comments);


    } // end main try()
    catch(Exception exc)
    {
        Util.HandleExc(this,fn,exc);
        return("");
    }
}

4

मेरे अनुसार

concat('This is line 1.', 0xd0a, 'This is line 2.')

या

concat(N'This is line 1.', 0xd000a, N'This is line 2.')

3

यह हमेशा शांत होता है, क्योंकि जब आप ओरेकल कहते हैं, तो एक्सपोर्टेड लिस्ट मिलती है, तब आपको कई पंक्तियों में फैले रिकॉर्ड मिलते हैं, जो बदले में, सीवीएस फाइलों के लिए दिलचस्प हो सकते हैं, इसलिए सावधान रहें।

किसी भी तरह, रोब का जवाब अच्छा है, लेकिन मैं @ के अलावा कुछ और का उपयोग करने की सलाह दूंगा, कुछ और प्रयास करें, जैसे §§ @@ so या कुछ और, तो यह कुछ विशिष्टता का मौका होगा। (लेकिन फिर भी, की लंबाई याद varchar/ nvarcharक्षेत्र आप में डालने कर रहे हैं ..)


3

ये सभी विकल्प आपकी स्थिति के आधार पर काम करते हैं, लेकिन यदि आप SSMS का उपयोग कर रहे हैं, तो आप उनमें से कोई भी काम नहीं देख सकते हैं (जैसा कि कुछ टिप्पणियों में उल्लेख किया गया है SSMS CR / LF को छुपाता है)

इसलिए खुद को मोड़ने के बजाय ड्राइविंग करें, इस सेटिंग को चेक करें

Tools | Options

जो बदलेगा

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