BULK INSERT falha e retrocede ou não?

1

Ao importar um arquivo de dados csv com uma instrução BULK INSERT muito básica em um servidor de banco de dados SQL 2005, recebi alguns erros de formatação e, em seguida, um erro de chave duplicado:

Msg 4864, Level 16, State 1, Line 1
Bulk load data conversion error (type mismatch or invalid character for the specified codepage) for row 8625, column 6 (min_prc).
Msg 4864, Level 16, State 1, Line 1
Bulk load data conversion error (type mismatch or invalid character for the specified codepage) for row 8627, column 6 (min_prc).
Msg 2627, Level 14, State 1, Line 1
Violation of PRIMARY KEY constraint [TABLE]. Cannot insert duplicate key in object [TABLE].
The statement has been terminated.

A operação inteira falhou sem realmente ter inserido nenhum registro? Tem os registros antes que o erro de chave duplicado seja inserido?

Alguém pode me indicar um site / documento que descreva as ações de inserção em massa em caso de erros?

Obrigado a todos pela ajuda!

    
por Danilo Brambilla 09.09.2010 / 21:47

2 respostas

1

A questão de estouro de pilha, É a inserção em massa do SQL Server transacional? , parece responder a sua pergunta.

Para referência, sim, eles foram inseridos, a menos que você tenha inserido manualmente a inserção em massa em uma transação definida pelo usuário com uma reversão. A inserção em massa trata cada linha como uma inserção individual.

    
por 09.09.2010 / 22:05
1

Você pode reverter as inserções. Para fazer isso, precisamos entender duas coisas primeiro

BatchSize

: No of rows to be inserted per transaction . The Default is entire Data File. So a data file is in transaction

Digamos que você tenha um arquivo de texto com 10 linhas e linha 8 e a linha 7 tenha alguns detalhes inválidos. Quando você insere o arquivo em massa sem especificar ou com a especificação do tamanho do lote, 8 de 10 são inseridos na tabela. A Linha Inválida, por exemplo, 8º e 7º, falha e não é inserida.

Isso acontece porque a contagem MAXERRORS padrão é 10 por transação.

Como no MSDN:

MAXERRORS :

Specifies the maximum number of syntax errors allowed in the data before the bulk-import operation is canceled. Each row that cannot be imported by the bulk-import operation is ignored and counted as one error. If max_errors is not specified, the default is 10.

Portanto, para falhar todas as 10 linhas, mesmo que uma seja inválida, precisamos definir MAXERRORS=1 e BatchSize=1 Aqui, o número de BatchSize também é importante.

Se você especificar BatchSize e a linha inválida estiver dentro do lote específico, ele irá reverter somente o lote específico, não o conjunto de dados inteiro. Portanto, tenha cuidado ao escolher esta opção

Espero que isso resolva o problema.

    
por 22.12.2016 / 14:56