new - vbcrlf in t sql




Como inserir uma quebra de linha em uma cadeia VARCHAR/NVARCHAR do SQL Server (6)

Aqui está uma função C # que preenche uma linha de texto para um blob de texto existente, delimitado por CRLFs e retorna uma expressão T-SQL adequada para operações INSERT ou UPDATE . Ele tem um pouco do nosso tratamento de erros proprietário, mas depois de extrair isso, pode ser útil - espero que sim.

/// <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("");
    }
}

Eu não vi nenhuma pergunta semelhante sobre este tópico, e eu tive que pesquisar isso para algo que estou trabalhando agora. Pensei em postar a resposta para o caso de alguém ter a mesma pergunta.



Execute isso no SSMS, ele mostra como as quebras de linha no próprio SQL se tornam parte dos valores de sequência que abrangem as linhas:

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

Resultado:
Linha 1
Linha 2
Linha 3

Quanto tempo dura um feed de linha em branco?
2

Quais são os valores ASCII?
13
10

Ou se você preferir especificar sua string em uma linha (quase!) Você poderia utilizar REPLACE() assim (opcionalmente, usar CHAR(13)+CHAR(10) como substituto):

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

Isso é sempre legal, porque quando você obtém listas exportadas, digamos Oracle, você obtém registros que abrangem várias linhas, o que, por sua vez, pode ser interessante para, digamos, arquivos cvs, portanto, cuidado.

De qualquer forma, a resposta de Rob é boa, mas aconselho usar outra coisa que não @, tente mais algumas, como §§ @@ §§ ou algo assim, para que tenha uma chance de alguma exclusividade. (Mas ainda assim, lembre-se do tamanho do campo varchar / nvarchar no qual você está inserindo ..)


Outra maneira de fazer isso é assim:

INSERT CRLF SELECT 'fox 
jumped'

Ou seja, simplesmente inserir uma quebra de linha na sua consulta enquanto estiver escrevendo, adicionará a quebra ao banco de dados. Isso funciona no SQL Server Management Studio e no Query Analyzer. Eu acredito que isso também funcionará em C # se você usar o sinal @ em strings.

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

eu diria

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

ou

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






line-breaks