SQL Server VARCHAR / NVARCHAR dizesine satır sonu ekleme


562

Bu konuda sorulan benzer soruları görmedim ve şu anda üzerinde çalıştığım bir şey için bunu araştırmak zorunda kaldım. Başkasının aynı soruyu sorması durumunda bunun cevabını yazacağımı düşündüm.


8
Çıktınızı test etmek için, SSMS kullanıyorsanız Kopyalama veya kaydetme sırasında CR / LF'yi Koru seçeneğinin işaretli olduğundan emin olun, aksi takdirde yapıştırılan tüm sonuçlar satır beslemesini kaybeder. Bunu ayarlar, sorgu sonuçları, sql server, grid sonuçlarında bulabilirsiniz.
Stefanos Zilellis

1
@StefanosZilellis ve ayar değişikliklerinin geçerli olması için yeni bir sorgu penceresi açtığınızdan emin olun.
Don Cheadle

Yanıtlar:


597

char(13)olduğunu CR. DOS- / Windows tarzı CRLFçizgi satırları için istediğiniz char(13)+char(10)gibi:

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

28
char (13) + char (10) pencerelerde benim için çalışmadı. Ben sadece char (10) kullandım
nima

6
@Nima: Bazı uygulamalar yeni bir satır göstermek için birini ya da diğerini ya da her ikisini kullanır, ancak bu metnin çıktısını alabileceğiniz birçok uygulama her ikisinin de yeni bir satırı belirtmek için art arda görünmesini gerektirir. Her ikisini de kullanmak güvenli buluyorum. Burada hangi uygulamaların işe yaramadığını listeleyebilirsiniz. CHAR (0x0D) + CHAR (0x0A) onaltılı değerlerini kendim tercih ediyorum, ama her birine kendi.
MikeTeeVee

2
Bu yöntemi başarıyla kullandım, ancak onunla ilgili bir sorunla karşılaştım: yaklaşık 480'den fazla var +, SQL Server, sorgunuzun çok derinden iç içe olduğundan şikayet etmeye başlayacaktır. Benim çözümüm bunun yerine Rob Cooper'ın cevabını kullanmaktı, ama çok daha uzun ve daha belirsiz bir jetonla.
Marcus Downing

5
\ R \ n sağlamak, düzenli ifadelerin bulunduğunu ve bunları anlayabilen ve kullanabilen kullanıcıların olduğu anlamına gelir.
wwmbes

10
@HBlackorby \ r ve \ n, Java kullanımından on yıl önce C'deki kullanımlarından önce gelir; ve Python, PHP, Ruby, C ++, C #,
vb.'de standarttır

286

Cevabı burada buldum: http://blog.sqlauthority.com/2007/08/22/sql-server-t-sql-script-to-insert-carriage-return-and-new-line-feed-in- kodu /

Sadece dizeyi birleştirin ve CHAR(13)satır sonunu istediğiniz yere ekleyin .

Misal:

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

Bu aşağıdakileri yazdırır:

Bu satır 1'dir.
Bu satır 2'dir.


11
GÜNCELLEME: unut gitsin. Sadece iyi yerleştirir. Sekmeler ve yeni satırları görünürlük alanlarıyla değiştiren yönetim stüdyosu
Daniel Dolz

12
Bu sonucu almak için PRINT @text yerine SELECT kullanmanız gerekiyor gibi görünüyor.
QMaster

3
BTW: NCHAR(0x1234)Unicode karakter almak için de kullanabilirsiniz . Satır kesmeleri eklemek için gerekli değildir, ancak unicode karakterler eklemek / aramak gerekiyorsa kullanışlı olabilir.
Paul Groke

3
SQL Server 2016 yılında, ben sadece kullanmak eğer iki satır yazdırmak bakınız printyerine selectgibi:DECLARE @text NVARCHAR(100); SET @text = 'This is line 1.' + CHAR(13) + 'This is line 2.'; print @text;
devinbost

7
Çıktınızı test etmek için, SSMS kullanıyorsanız Kopyalama veya kaydetme sırasında CR / LF'yi Koru seçeneğinin işaretli olduğundan emin olun, aksi takdirde yapıştırılan tüm sonuçlar satır beslemesini kaybeder. Bunu ayarlar, sorgu sonuçları, sql server, grid sonuçlarında bulabilirsiniz.
Don Cheadle

81

Bunu yapmanın başka bir yolu da şöyledir:

INSERT CRLF SELECT 'fox 
jumped'

Yani, sorgunuza yazarken satır sonu eklemek, veritabanına benzer sonu ekleyecektir. Bu, SQL Server Management Studio ve Query Analyzer'da çalışır. Dizelerde @ işaretini kullanırsanız bu da C # çalışacağına inanıyorum.

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

14
Başka bir deyişle, SQL dilinin sözdizimi, dizgi değişmezlerindeki ham satır beslemelerine izin verir. Denediğim tüm motorlarda (SQL Server, Oracle, MySQL, PostgreSQL ve SQLite) bu şekilde çalışır.
Álvaro González

saklı yordamlarda kullanırsanız bazen bu rastgele çalışmadan çıkıyor
DaFi4

25

Bunu SSMS'de çalıştırın, SQL'deki satır sonlarının satırları kapsayan dize değerlerinin bir parçası haline geldiğini gösterir:

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

Sonuç:
Satır 1
Satır 2
Satır 3

Boş satır beslemesi ne kadardır?
2

ASCII değerleri nelerdir?
13
10

Veya dizenizi bir satırda (neredeyse!) Belirtmeyi tercih ederseniz, REPLACE()bu şekilde kullanabilirsiniz (isteğe bağlı CHAR(13)+CHAR(10)olarak yedek olarak kullanabilirsiniz ):

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

16

Bir Google'ı takip ediyor ...

Kodu web sitesinden almak:

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

Bir yer tutucuyu CHAR ile değiştirerek yapılabileceği anlaşılıyor (13)

Güzel soru, asla kendim yapmadım :)


4
Ancak metinde bir e-posta adresi varsa? "jon@bob.com" "jon bob.com" olur (e-elbisede yeni satır ile)
intrepidis

4
@ChrisNash daha sonra farklı bir yer tutucu kullanın (örn. "|", "~" Veya birden çok karakter, "! #!"). Aşağıdaki cevaba bakınız: stackoverflow.com/a/31179/179311 .
bradlis7

1
"CONCAT (CHAR (13), CHAR (10))" "(" \ r \ n ") durum için olduğunu düşündüğüm windows ortamı için daha iyi olurdu (SQL Server) cs.toronto.edu/~krueger/csc209h/ tut / line-endings.html
d.popov

12

Çünkü ben C # dizeleri belirtilen cr-lfs SQl Server Management Studio sorgu yanıtlarında gösterilmiyordu endişeli çünkü burada var.

Anlaşılıyor, oradalar, ancak görüntülenmiyorlar.

Cr-lfs'yi "görmek" için print ifadesini aşağıdaki gibi kullanın:

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

4

İşte C # işlevi olduğunu prepends bir metin CRLFlerin ile sınırlanmış mevcut metin blob çizgi, ve iadeler için uygun bir T-SQL ifadesi INSERTveya UPDATEoperasyonları. Bazı özel hata işleme var, ama bir kez bunu sökmek, yararlı olabilir - umarım öyle.

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

diyecektim ki

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

veya

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

3

Bu her zaman iyidir, çünkü Oracle'dan dışa aktarılan listeler aldığınızda, o zaman cvs dosyaları için ilginç olabilen birkaç satıra yayılan kayıtlar alırsınız, bu yüzden dikkatli olun.

Her neyse, Rob'un cevabı iyi, ama @ dışında bir şey kullanmanızı tavsiye ederim, §§ @@ §§ veya bir şey gibi birkaç tane daha deneyin, bu yüzden benzersiz olma şansı olacak. (Ama yine de, içine eklediğiniz varchar/ nvarcharalanının uzunluğunu hatırlayın ..)


3

Tüm bu seçenekler durumunuza bağlı olarak çalışır, ancak SSMS kullanıyorsanız bunların hiçbirinin işe yaramadığını görebilirsiniz (bazı yorumlarda belirtildiği gibi SSMS CR / LF'leri gizler)

Bu yüzden kendinizi virajın etrafında sürmek yerine, bu ayarı

Tools | Options

hangisinin yerini alacak

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.