Eu tenho um arquivo de dados no formato txt e costumava carregá-lo com Bulk Insert no seguinte comando:
Bulk insert [table1] FROM "data.txt" WITH ( FIELDTERMINATOR ="|", ROWTERMINATOR ="0x0a", )
O código funciona bem. No entanto, enquanto tentava usar um arquivo de formato com a inserção em massa para carregar o arquivo, encontrei alguns problemas ao especificar o terminador de campo para a última linha.
Aqui está a especificação para a última linha no arquivo de formato:
21 SQLCHAR 0 20 "0x0a" 21 misc_costs SQL_Latin1_General_CP1_CI_AS
Com “0x0a” como terminador, recebo o seguinte erro:
Erro de conversão de dados no carregamento em massa (truncamento) para a linha 2, coluna 1 (var1).
Com “\ n”, os dados podem ser carregado, mas “|” também é carregado na última coluna. Por exemplo, recebo “0,5 |” em vez de “0,5”.
“| \ n”, “0x0a”, “| 0x0a”, “\ r \ n” retorna o mesmo erro que “|”
Erro de conversão de dados de carregamento em massa (truncamento) para linha 2, coluna 1 (var1).
I ” m usando sql-server 2016, windows 10 64bit.
Alguém pode ajudar com isso? Agradecemos antecipadamente por sua ajuda!
Jason
Comentários
- Como você ' fez algumas perguntas sobre isso agora, dê uma olhada nesta página: sommarskog.se/bulkload.html
- @sp_BlitzErik, obrigado pela sua resposta! Esse artigo é muito útil e fornece muito mais informações do que o site do MSDN. Ao ler o exemplo em 4.1 , Fiquei confuso com o terminador de campo " \ " \ r \ n ", a citação está realmente completa, é um tipo?
- Se bem me lembro, é ' uma sequência de escape. Se você mantiver real lá ' uma explicação melhor mais adiante.
Resposta
Depois de um dia inteiro lutando com o código Line Feed / Hex, finalmente descobri que meu problema era causado por colunas ausentes nos arquivos de formato. O conjunto de dados é novo para mim e pensei que tinha 21 linhas, mas na verdade tem 22 linhas. É por isso que o sql server continuou carregando o último “|” do arquivo de dados.
Aqui está uma referência para outras pessoas que talvez estejam interessadas em carregar o arquivo de dados do sistema UNIX com terminadores de linha diferentes do Windows, há três métodos:
- use a inserção em massa e defina o terminador de linha como “0x0a”.
- use um arquivo de formato e defina o terminador de campo do último campo como “\ n “.
- Use um sql dinâmico com a função Char (10) para inserir a alimentação de linha (LF) na string de comando e, em seguida, exec () na string de comando.
Antes de tentar esses métodos, use um bloco de notas para mostrar todos os caracteres de controle para confirmar os caracteres de controle usados pelos arquivos de texto.
Se nenhum desses métodos funcionar para você, você pode ter alguns problemas além da linha feed / terminador de linha.