Cara menyisipkan baris istirahat dalam string SQL Server VARCHAR / NVARCHAR

562

Saya tidak melihat pertanyaan serupa yang diajukan pada topik ini, dan saya harus meneliti ini untuk sesuatu yang sedang saya kerjakan sekarang. Kupikir aku akan mengirim jawaban untuk itu kalau-kalau ada orang yang memiliki pertanyaan yang sama.

Mark Struzinski
sumber
8
Untuk menguji output Anda, jika menggunakan SSMS pastikan opsi Retain CR / LF pada copy atau save dicentang, jika tidak semua hasil yang disisipkan akan kehilangan umpan baris. Anda menemukan ini di pengaturan, hasil pencarian, server sql, hasil ke kotak.
Stefanos Zilellis
1
@StefanosZilellis dan pastikan untuk membuka jendela kueri baru agar perubahan pengaturan diterapkan.
Don Cheadle

Jawaban:

597

char(13)adalah CR. Untuk CRLFlinebreak gaya DOS / Windows , Anda ingin char(13)+char(10), seperti:

'This is line 1.' + CHAR(13)+CHAR(10) + 'This is line 2.'
Sören Kuklau
sumber
28
char (13) + char (10) tidak bekerja untuk saya di windows. Saya baru saja menggunakan char (10)
nima
6
@ Nima: Beberapa aplikasi akan menggunakan satu atau yang lain atau keduanya untuk menunjukkan baris baru, namun banyak aplikasi Anda dapat menampilkan teks ini akan membutuhkan keduanya muncul berturut-turut untuk menandakan baris baru. Saya merasa aman untuk menggunakan keduanya. Anda dapat mendaftar di sini aplikasi mana yang tidak berfungsi untuk Anda. Saya lebih suka nilai hexadecimal CHAR (0x0D) + CHAR (0x0A), tetapi masing-masing untuk mereka sendiri.
MikeTeeVee
2
Saya menggunakan metode ini dengan sukses, tetapi mengalami masalah dengan itu: setelah Anda memiliki lebih dari sekitar 480 +, SQL Server akan mulai mengeluh bahwa permintaan Anda terlalu bersarang. Solusi saya bukannya menggunakan jawaban Rob Cooper sebagai gantinya, tetapi dengan token yang jauh lebih lama dan lebih jelas.
Marcus Downing
5
Menyediakan \ r \ n akan berarti pengakuan bahwa ada ekspresi reguler dan bahwa ada pengguna yang mampu memahami dan menggunakannya.
wwmbes
10
@HBlackorby \ r dan \ n mendahului Java-apa saja selama beberapa dekade dengan penggunaannya dalam C; dan standar dalam Python, PHP, Ruby, C ++, C #, dll ...
Uueerdo
286

Saya menemukan jawabannya di sini: http://blog.sqlauthority.com/2007/08/22/sql-server-t-sql-script-to-insert-carriage-return-and-new-line-feed-in- kode/

Anda baru saja menyatukan string dan memasukkan di CHAR(13)mana Anda ingin jeda baris Anda.

Contoh:

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

Ini mencetak yang berikut ini:

Ini adalah baris 1.
Ini adalah baris 2.

Mark Struzinski
sumber
11
PEMBARUAN: lupakan saja. Menyisipkan baik-baik saja. Studio manajemen yang menggantikan tab dan baris baru dengan ruang untuk visibilitas
Daniel Dolz
12
Tampaknya Anda perlu menggunakan PRINT @text dan bukannya SELECT untuk mendapatkan hasil ini.
QMaster
3
BTW: Anda juga bisa menggunakan NCHAR(0x1234)untuk mendapatkan karakter unicode. Tidak perlu untuk menyisipkan jeda baris, tetapi bisa berguna jika seseorang harus memasukkan / mencari karakter unicode.
Paul Groke
3
Dalam SQL Server 2016, saya hanya melihatnya mencetak dua baris jika saya menggunakan printbukan select, seperti:DECLARE @text NVARCHAR(100); SET @text = 'This is line 1.' + CHAR(13) + 'This is line 2.'; print @text;
devinbost
7
Untuk menguji output Anda, jika menggunakan SSMS pastikan opsi Retain CR / LF pada copy atau save dicentang, jika tidak semua hasil yang disisipkan akan kehilangan umpan baris. Anda menemukan ini di pengaturan, hasil pencarian, server sql, hasil ke kotak.
Don Cheadle
81

Cara lain untuk melakukan ini adalah sebagai berikut:

INSERT CRLF SELECT 'fox 
jumped'

Artinya, cukup menyisipkan satu baris ke dalam kueri Anda saat menulisnya akan menambah seperti pada database. Ini berfungsi di SQL server Management studio dan Query Analyzer. Saya percaya ini juga akan berfungsi di C # jika Anda menggunakan tanda @ pada string.

string str = @"INSERT CRLF SELECT 'fox 
    jumped'"
Frank V
sumber
14
Dengan kata lain, sintaks bahasa SQL hanya memungkinkan umpan garis mentah dalam string literal. Ini bekerja dengan cara ini di semua mesin yang saya coba (SQL Server, Oracle, MySQL, PostgreSQL dan SQLite).
Álvaro González
kadang-kadang ini secara acak berhenti bekerja jika Anda menggunakannya dalam prosedur tersimpan
DaFi4
25

Jalankan ini dalam SSMS, ini menunjukkan bagaimana jeda baris dalam SQL itu sendiri menjadi bagian dari nilai string yang menjangkau garis:

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

Hasil:
Baris 1
Baris 2
Baris 3

Berapa lama umpan baris kosong?
2

Apa nilai-nilai ASCII?
13
10

Atau jika Anda lebih suka menentukan string Anda pada satu baris (hampir!) Anda dapat menggunakan REPLACE()seperti ini (opsional digunakan CHAR(13)+CHAR(10)sebagai pengganti):

PRINT REPLACE('Line 1`Line 2`Line 3','`','
')
Ajs Jsy
sumber
16

Mengikuti Google ...

Mengambil kode dari situs web:

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

Sepertinya itu bisa dilakukan dengan mengganti placeholder dengan CHAR (13)

Pertanyaan bagus, tidak pernah melakukannya sendiri :)

Rob Cooper
sumber
4
Tetapi apakah teks itu memiliki alamat email di dalamnya? "[email protected]" menjadi "jon bob.com" (dengan baris baru di e-dress)
intrepidis
4
@ChrisNash kemudian gunakan placeholder yang berbeda (mis. "|", "~", Atau beberapa karakter, "! #!"). Lihat jawaban ini di bawah: stackoverflow.com/a/31179/179311 .
bradlis7
1
"CONCAT (CHAR (13), CHAR (10))" ("\ r \ n") akan lebih baik untuk lingkungan windows, yang saya asumsikan adalah case (SQL Server) cs.toronto.edu/ ~krueger/csc209h/ tut / line-endings.html
d.popov
12

Saya tiba di sini karena saya khawatir bahwa cr-lfs yang saya tentukan dalam string C # tidak ditampilkan dalam respons kueri SQl Server Management Studio.

Ternyata, mereka ada di sana, tetapi tidak ditampilkan.

Untuk "melihat" cr-lfs, gunakan pernyataan cetak seperti:

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

Berikut adalah fungsi C # yang menambahkan baris teks ke gumpalan teks yang ada, dibatasi oleh CRLF, dan mengembalikan ekspresi T-SQL yang cocok untuk INSERTatau UPDATEoperasi. Ada beberapa kesalahan kepemilikan kami di dalamnya, tetapi begitu Anda mencabutnya, mungkin akan membantu - saya harap begitu.

/// <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("");
    }
}
Carl Niedner
sumber
4

aku akan mengatakan

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

atau

concat(N'This is line 1.', 0xd000a, N'This is line 2.')
Ken Kin
sumber
3

Ini selalu keren, karena ketika Anda mendapatkan daftar yang diekspor dari, katakanlah Oracle, maka Anda mendapatkan catatan yang mencakup beberapa baris, yang pada gilirannya dapat menarik untuk, katakanlah, file cvs, jadi waspadalah.

Bagaimanapun, jawaban Rob baik, tetapi saya akan menyarankan menggunakan sesuatu selain dari @, coba beberapa lagi, seperti §§ @@ §§ atau sesuatu, jadi itu akan memiliki kesempatan untuk beberapa keunikan. (Tapi tetap saja, ingat panjang bidang varchar/ yang nvarcharAnda masukkan ke ..)

neslekkiM
sumber
3

Semua opsi ini bekerja tergantung pada situasi Anda, tetapi Anda mungkin tidak melihat satu pun dari mereka bekerja jika Anda menggunakan SSMS (seperti yang disebutkan dalam beberapa komentar SSMS menyembunyikan CR / LFs)

Jadi daripada mengarahkan diri Anda di tikungan, Periksa pengaturan ini di

Tools | Options

yang akan menggantikan

Trubs
sumber