কীভাবে একটি এসকিউএল সার্ভার ভর্চার / এনভিচারার স্ট্রিংয়ে একটি লাইন ব্রেক সন্নিবেশ করা যায়


559

আমি এই বিষয়ে অনুরূপ কোনও অনুরূপ প্রশ্ন দেখিনি, এবং আমি এখনই কাজ করছি এমন কিছু জন্য এটি নিয়ে গবেষণা করতে হয়েছিল। ভেবেছিলাম অন্য কারও যদি একই প্রশ্ন থাকে তবে আমি এর উত্তর পোস্ট করব।


8
আপনার আউটপুটটি পরীক্ষা করার জন্য, যদি এসএসএমএস ব্যবহার করে নিশ্চিত হন যে অনুলিপিটি সংরক্ষণের জন্য সিআর / এলএফ পুনরুদ্ধার করা আছে কিনা তা পরীক্ষা করা হয়েছে, অন্যথায় সমস্ত আটকানো ফলাফল লাইন ফিডটি আলগা করবে। আপনি সেটিংসে, ক্যোয়ারির ফলাফলগুলি, এসকিএল সার্ভারে, গ্রিডের ফলাফলগুলিতে এটি খুঁজে পান।
স্টিফানোস জিলেলিস

1
@ স্টেফানোসজিলেলিস এবং সেটিংসের পরিবর্তনগুলি কার্যকর হওয়ার জন্য একটি নতুন ক্যোয়ারী উইন্ডোটি খুলতে ভুলবেন না।
ডন চ্যাডেল

উত্তর:


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 এর বেশি হয়ে গেলে +, এসকিউএল সার্ভার আপনার জিজ্ঞাসাটি খুব গভীরভাবে নেস্ট করেছে বলে অভিযোগ করা শুরু করবে। আমার সমাধানটি পরিবর্তে রব কুপারের উত্তরটি ব্যবহার করা ছিল, তবে অনেক দীর্ঘ এবং আরও অস্পষ্ট টোকেন সহ।
মার্কাস ডাউনিং

5
\ R \ n সরবরাহ করার অর্থ স্বীকৃতি হ'ল নিয়মিত প্রকাশের উপস্থিতি রয়েছে এবং সেগুলি বোঝার এবং ব্যবহার করতে সক্ষম এমন ব্যবহারকারী রয়েছে।
wwmbes

10
@HBlackorby \ r এবং \ n সি ব্যবহার করে কয়েক দশক ধরে জাভা-কোনও কিছুর পূর্বাভাস দেয়; এবং পাইথন, পিএইচপি, রুবি, সি ++, সি # ইত্যাদি ইত্যাদিতে
মানসম্পন্ন

285

আমি উত্তরটি এখানে পেয়েছি: http://blog.sqlauthority.com/2007/08/22/sql-server-t-sql-script-to-insert-carriage-return-and-new-line-feed-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 এর পরিবর্তে নির্বাচন করুন।
কিউমাস্টার

3
বিটিডাব্লু: আপনি NCHAR(0x1234)একটি ইউনিকোড চরিত্র পেতে ব্যবহার করতে পারেন। লাইন ব্রেক সন্নিবেশ করানোর জন্য প্রয়োজনীয় নয়, তবে ইউনিকোডের অক্ষর সন্ধান করতে বা সন্ধান করতে চাইলে অবশ্যই কাজে আসতে পারে।
পল গ্রোক

3
এসকিউএল সার্ভার printselectDECLARE @text NVARCHAR(100); SET @text = 'This is line 1.' + CHAR(13) + 'This is line 2.'; print @text;
২০১

7
আপনার আউটপুটটি পরীক্ষা করার জন্য, যদি এসএসএমএস ব্যবহার করে নিশ্চিত হন যে অনুলিপিটি সংরক্ষণের জন্য সিআর / এলএফ পুনরুদ্ধার করা আছে কিনা তা পরীক্ষা করা হয়েছে, অন্যথায় সমস্ত আটকানো ফলাফল লাইন ফিডটি আলগা করবে। আপনি সেটিংসে, ক্যোয়ারির ফলাফলগুলি, এসকিএল সার্ভারে, গ্রিডের ফলাফলগুলিতে এটি খুঁজে পান।
ডন

81

এটি করার আরেকটি উপায় হ'ল:

INSERT CRLF SELECT 'fox 
jumped'

এটি হ'ল লেখার সময় আপনার ক্যোয়ারীতে কেবল একটি লাইন ব্রেক সন্নিবেশ করানো ডাটাবেজে লাইক ব্রেকটি যুক্ত করবে। এটি এসকিউএল সার্ভার ম্যানেজমেন্ট স্টুডিও এবং ক্যোয়ারী অ্যানালাইজারে কাজ করে। আমি বিশ্বাস করি যদি আপনি @ চিহ্নটিতে স্ট্রিং ব্যবহার করেন তবে এটি সি # তেও কাজ করবে।

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

14
অন্য কথায়, এসকিউএল ভাষার সিনট্যাক্স কেবল স্ট্রিং লিটারেলগুলিতে কাঁচা রেখা ফিডের অনুমতি দেয়। আমি চেষ্টা করেছি এমন সমস্ত ইঞ্জিনে এটি এভাবে কাজ করে (এসকিউএল সার্ভার, ওরাকল, মাইএসকিউএল, পোস্টগ্র্রেএসকিউএল এবং এসকিউএলাইট)।
আলভারো গঞ্জালেজ

কখনও কখনও এটি এলোমেলোভাবে কাজটি ছেড়ে দেয় যদি আপনি এটি
স্টোরেজ

25

এটি এসএসএমএসে চালান, এটি দেখায় যে কীভাবে এসকিউএলটিতে লাইন বিভাজনগুলি স্ট্রিং মানগুলির অংশ হয়ে যায় যা রেখাগুলিকে বিস্তৃত করে:

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

এএসসিআইআই মানগুলি কী কী?
13
10

অথবা আপনি যদি তার পরিবর্তে এক লাইনে (প্রায়!) আপনার স্ট্রিং নির্দিষ্ট করে থাকেন তবে আপনি এইভাবে নিয়োগ করতে REPLACE()পারেন (ally CHAR(13)+CHAR(10)চ্ছিকভাবে প্রতিস্থাপন হিসাবে ব্যবহার করুন):

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

16

একটি গুগল অনুসরণ করা ...

ওয়েবসাইট থেকে কোড নেওয়া:

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" (ই-ড্রেসে একটি নতুন লাইন সহ) হয়ে যায়
ইন্ট্রিপিডিস

4
@ ক্রিসনাশ তার পরে একটি পৃথক স্থানধারক (যেমন "|", "~", বা একাধিক অক্ষর, "! #!") ব্যবহার করুন। এই উত্তরটি নীচে দেখুন: stackoverflow.com/a/31179/179311
bradlis7

1
"কনক্যাট (CHAR (13), CHAR (10))" ("\ r \ n") উইন্ডোজের পরিবেশের জন্য ভাল হবে, যা আমি ধরে নিই কেস (এসকিউএল সার্ভার) cs.toronto.edu/~krueger/csc209h/ tut / line-endings.html
d.popov

12

আমি এখানে এসেছি কারণ আমি উদ্বিগ্ন ছিলাম যে সি-স্ট্রিংগুলিতে আমি উল্লেখ করেছি যে cr-lfs এসকিউএল সার্ভার ম্যানেজমেন্ট স্টুডিওর কোয়েরি প্রতিক্রিয়াগুলিতে দেখানো হচ্ছে না।

দেখা যাচ্ছে যে তারা সেখানে রয়েছে তবে প্রদর্শিত হচ্ছে না।

Cr-lfs "দেখতে", মুদ্রণ বিবৃতিটি ব্যবহার করুন:

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

4

এখানে একটি সি # ফাংশন রয়েছে যা বিদ্যমান টেক্সট ব্লকে একটি পাঠ্য লাইন প্রিপেন্ড করে, সিআরএলএফ দ্বারা সীমান্তে প্রেরণ করা হয়েছে এবং টি-এসকিউএল এক্সপ্রেশনটি কার্যকর 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

এটি সর্বদা দুর্দান্ত, কারণ আপনি যখন Oracle থেকে রফতানি তালিকা পেয়ে যান, তখন আপনি বেশ কয়েকটি লাইন বিস্তৃত রেকর্ডগুলি পান যা ফলস্বরূপ, cvs ফাইলগুলির জন্য আকর্ষণীয় হতে পারে, তাই সাবধান হন।

যাইহোক, রবের উত্তর ভাল, তবে আমি @ এর চেয়ে অন্য কিছু ব্যবহার করার পরামর্শ দেব, §§ @@ §§ বা অন্য কিছু এর মতো আরও কিছু চেষ্টা করুন, যাতে এর কিছুটা স্বতন্ত্রতার সুযোগ থাকবে। (তবে তবুও, আপনি varchar/ nvarcharক্ষেত্রটি সন্নিবেশ করানোর দৈর্ঘ্যের কথা মনে রাখবেন ..)


3

এই সমস্ত বিকল্পগুলি আপনার পরিস্থিতির উপর নির্ভর করে কাজ করে তবে আপনি যদি এসএসএমএস ব্যবহার করেন তবে সেগুলির কোনওটিই আপনি দেখতে পাবেন না (কিছু মন্তব্যে বলা হয়েছে এসএসএমএস সিআর / এলএফ লুকিয়ে রাখে)

সুতরাং নিজেকে মোড় ঘুরিয়ে চালানোর চেয়ে এই সেটিংটি চেক করুন

Tools | Options

যা প্রতিস্থাপন করবে

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.