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.
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.
Yanıtlar:
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.'
+
, 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.
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.
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.
print
yerine select
gibi:DECLARE @text NVARCHAR(100); SET @text = 'This is line 1.' + CHAR(13) + 'This is line 2.'; print @text;
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'"
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','`','
')
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 :)
Çü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
İş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 INSERT
veya UPDATE
operasyonları. 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("");
}
}
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
/ nvarchar
alanının uzunluğunu hatırlayın ..)