Non ho visto domande simili su questo argomento e ho dovuto cercare questo per qualcosa a cui sto lavorando in questo momento. Ho pensato di pubblicare la risposta nel caso in cui qualcun altro avesse avuto la stessa domanda.
Non ho visto domande simili su questo argomento e ho dovuto cercare questo per qualcosa a cui sto lavorando in questo momento. Ho pensato di pubblicare la risposta nel caso in cui qualcun altro avesse avuto la stessa domanda.
Risposte:
char(13)
lo è CR
. Per stile Windows DOS / CRLF
interruzioni di linea, che volete char(13)+char(10)
, come:
'This is line 1.' + CHAR(13)+CHAR(10) + 'This is line 2.'
+
, SQL Server inizierà a lamentarsi che la tua query è nidificata troppo profondamente. La mia soluzione era invece quella di utilizzare la risposta di Rob Cooper, ma con un token molto più lungo e più oscuro.
Ho trovato la risposta qui: http://blog.sqlauthority.com/2007/08/22/sql-server-t-sql-script-to-insert-carriage-return-and-new-line-feed-in- codice/
Basta concatenare la stringa e inserire un punto in CHAR(13)
cui si desidera interrompere la linea.
Esempio:
DECLARE @text NVARCHAR(100)
SET @text = 'This is line 1.' + CHAR(13) + 'This is line 2.'
SELECT @text
Questo stampa quanto segue:
Questa è la linea 1.
Questa è la linea 2.
NCHAR(0x1234)
per ottenere un carattere unicode. Non è necessario per inserire interruzioni di riga, ma può tornare utile se è necessario inserire / cercare caratteri unicode.
print
invece di select
, come ad esempio:DECLARE @text NVARCHAR(100); SET @text = 'This is line 1.' + CHAR(13) + 'This is line 2.'; print @text;
Un altro modo per farlo è come tale:
INSERT CRLF SELECT 'fox
jumped'
Cioè, semplicemente inserendo un'interruzione di riga nella query durante la scrittura, si aggiungerà un'interruzione simile al database. Funziona con SQL Server Management Studio e Query Analyzer. Credo che funzionerà anche in C # se usi il segno @ sulle stringhe.
string str = @"INSERT CRLF SELECT 'fox
jumped'"
Esegui questo in SSMS, mostra come le interruzioni di riga nello stesso SQL diventano parte di valori di stringa che si estendono su linee:
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))
Risultato:
linea 1
linea 2
linea 3
Quanto dura un feed di riga vuota?
2
Quali sono i valori ASCII?
13
10
Oppure, se preferisci specificare la stringa su una riga (quasi!), Potresti utilizzare in REPLACE()
questo modo (facoltativamente utilizzare CHAR(13)+CHAR(10)
come sostituzione):
PRINT REPLACE('Line 1`Line 2`Line 3','`','
')
A seguito di un Google ...
Prendendo il codice dal sito 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))
Sembra che possa essere fatto sostituendo un segnaposto con CHAR (13)
Bella domanda, non l'ho mai fatto da solo :)
Sono arrivato qui perché ero preoccupato che cr-lfs che avevo specificato nelle stringhe C # non venisse mostrato nelle risposte alle query di SQl Server Management Studio.
Si scopre che sono lì, ma non vengono visualizzati.
Per "vedere" cr-lfs, usa l'istruzione print come:
declare @tmp varchar(500)
select @tmp = msgbody from emailssentlog where id=6769;
print @tmp
Ecco una funzione C # che antepone una riga di testo a un BLOB di testo esistente, delimitato da CRLF e restituisce un'espressione T-SQL adatta per INSERT
o UPDATE
operazioni. Ci sono alcuni dei nostri errori proprietari nella gestione, ma una volta che lo hai strappato fuori, potrebbe essere utile - lo spero.
/// <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("");
}
}
Questo è sempre interessante, perché quando si ottengono elenchi esportati da, diciamo Oracle, si ottengono record che si estendono su più righe, il che a sua volta può essere interessante per, diciamo, i file cvs, quindi attenzione.
Ad ogni modo, la risposta di Rob è buona, ma consiglierei di usare qualcos'altro oltre a @, provane un po 'di più, come §§ @@ §§ o qualcosa del genere, quindi avrà una possibilità per un po' di unicità. (Tuttavia, ricorda la lunghezza del campo varchar
/ nvarchar
che stai inserendo ..)