Clave duplicada

Hola, Estoy insertando datos desde un documento txt a SQL server con el comando Bulk insert y me sale el error de clave duplicada, quisiera saber como puedo omitir ese registro con ese error y seguir insertando los demás registros, para que no se me corte la sentencia, con lo cual, no se introducen los datos.

1 respuesta

Respuesta
1
No creo que se pueda, ya que por eso se tiene la definición de llave.
BULK INSERT
Copia un archivo de datos a una tabla o vista de base de datos en un formato especificado por el usuario.
Sintaxis
BULK INSERT [ [ 'database_name'.] [ 'owner' ].] { 'table_name' FROM 'data_file' }
[WITH
(
[ BATCHSIZE [ = batch_size ] ]
[ [ , ] CHECK_CONSTRAINTS ]
[ [ , ] CODEPAGE [ = 'ACP' | 'OEM' | 'RAW' | 'code_page' ] ]
[ [ , ] DATAFILETYPE [ =
{ 'char' | 'native'| 'widechar' | 'widenative' } ] ]
[ [ , ] FIELDTERMINATOR [ = 'field_terminator' ] ]
[ [ , ] FIRSTROW [ = first_row ] ]
[ [ , ] FIRE_TRIGGERS ]
[ [ , ] FORMATFILE = 'format_file_path' ]
[ [ , ] KEEPIDENTITY ]
[ [ , ] KEEPNULLS ]
[ [ , ] KILOBYTES_PER_BATCH [ = kilobytes_per_batch ] ]
[ [ , ] LASTROW [ = last_row ] ]
[ [ , ] MAXERRORS [ = max_errors ] ]
[ [ , ] ORDER ( { column [ ASC | DESC ] } [ ,...n ] ) ]
[ [ , ] ROWS_PER_BATCH [ = rows_per_batch ] ]
[ [ , ] ROWTERMINATOR [ = 'row_terminator' ] ]
[ [ , ] TABLOCK ]
)
]
Argumentos
'database_name'
Es el nombre de la base de datos en la que reside la tabla o vista especificada. Si no se especifica, es la base de datos actual.
'owner'
Es el nombre del propietario de la tabla o vista. El argumento owner es opcional si el usuario que realiza la copia masiva es propietario de la tabla o vista especificada. Si no se especifica el argumento owner y el usuario que realiza la copia masiva no es propietario de la tabla o de la vista especificada, ¿Microsoft® SQL Server? Devuelve un mensaje de error y se cancela la operación de copia masiva.
'table_name'
Es el nombre de la tabla o vista en la que se va a realizar una copia masiva de datos. Sólo se pueden utilizar vistas en que todas las columnas hagan referencia a la misma tabla base. Para obtener más información acerca de las restricciones para la copia de datos en vistas, consulte INSERT.
'data_file'
Es la ruta de acceso completa del archivo de datos que contiene los datos que se van a copiar a la tabla o vista especificada. BULK INSERT puede copiar datos de un disco (incluidos una red, disquete, disco duro, etc.).
El argumento data_file debe especificar una ruta de acceso válida del servidor en que se ejecuta SQL Server. Si data_file es un archivo remoto, especifique un nombre de Convención de nomenclatura universal (UNC).
BATCHSIZE [ = batch_size ]
Especifica el número de filas de un lote. Cada lote se copia en el servidor como una transacción. SQL Server confirma o, en caso de error, deshace la transacción para cada lote. De forma predeterminada, todos los datos del archivo de datos especificado componen un lote.
CHECK_CONSTRAINTS
Especifica que, durante la operación de copia masiva, se comprueba la existencia de restricciones en table_name. De forma predeterminada, las restricciones se pasan por alto.
CODEPAGE [ = 'ACP' | 'OEM' | 'RAW' | 'code_page' ]
Especifica la página de códigos de los datos incluidos en el archivo de datos. CODEPAGE sólo es relevante si los datos contienen columnas de tipo char, varchar o text con valores de caracteres mayores que 127 o menores que 32.
Valor de CODEPAGE Descripción
ACP Las columnas de los tipos de datos char, varchar y text se convierten de la página de códigos ANSI/Microsoft Windows® (ISO 1252) a la página de códigos de SQL Server.
OEM (valor predeterminado) Las columnas de los tipos de datos char, varchar y text se convierten de la página de códigos de sistema OEM a la página de códigos de SQL Server.
RAW No se realiza conversión de una página de códigos a otra; ésta es la opción más rápida.
Code_page Número específico de una página de códigos, por ejemplo, 850.
DATAFILETYPE [ = {'char' | 'native' | 'widechar' | 'widenative' } ]
Especifica que BULK INSERT realiza la operación de copia con el valor predeterminado especificado.
Valor de DATAFILETYPE Descripción
char (predeterminado) Realiza la operación de copia masiva de un archivo de datos que contiene datos de caracteres.
Nativo Realiza la operación de copia masiva con los tipos de datos native (base de datos). El archivo de datos que se va a cargar se creó mediante una copia masiva de datos desde SQL Server con la herramienta bcp.
Widechar Realiza la operación de copia masiva de un archivo de datos que contiene caracteres Unicode.
Widenative Realiza la misma operación de copia masiva que native, excepto que las columnas de tipo char, varchar y text se almacenan como Unicode en el archivo de datos. El archivo de datos que se va a cargar se creó mediante una copia masiva de datos desde SQL Server con la herramienta bcp. Esta opción es una alternativa de mayor rendimiento que la opción widechar y su propósito es la transferencia de datos de un equipo que ejecuta SQL Server a otro mediante un archivo de datos. Utilice esta opción cuando vaya a transferir datos que contienen caracteres ANSI extendidos y desee aprovechar el rendimiento del modo native.
FIELDTERMINATOR [ = 'field_terminator' ]
Especifica el terminador de campo que se utilizará para los archivos de datos de tipo char y widechar. El valor predeterminado es \t (carácter de tabulador).
FIRSTROW [ = first_row ]
Especifica el número de la primera fila que se va a copiar. El valor predeterminado es 1, que hace referencia a la primera fila del archivo de datos especificado.
FIRE_TRIGGERS
Especifica que se ejecutarán todos los desencadenadores de inserción definidos en la tabla de destino durante la operación de copia masiva. Si no se especifica FIRE_TRIGGERS, no se ejecutará ningún desencadenador.
FORMATFILE [ = 'format_file_path' ]
Especifica la ruta de acceso completa de un archivo de formato. Un archivo de formato describe el contenido del archivo de datos que contiene respuestas almacenadas creadas con la herramienta bcp en la misma tabla o vista. Se debe utilizar el archivo de formato en los casos en que:
El archivo de datos contiene un número de columnas mayor o menor que la tabla o vista.
Las columnas están en un orden diferente.
Los delimitadores de columnas varían.
Hay otros cambios en el formato de los datos. Los archivos de formato se suelen crear con la herramienta bcp y se modifican con un editor de texto si es necesario. Para obtener más información, consulte Herramienta bcp.
Keepidentity
Especifica que los valores de una columna de identidad están presentes en el archivo que se importa. Si no se especifica KEEPIDENTITY, se omiten los valores de identidad de esta columna en el archivo de datos que se importa y SQL Server asigna automáticamente valores únicos basados en los valores de inicialización y de incremento especificados durante la creación de la tabla. Si el archivo de datos no contiene valores para la columna de identidad de la tabla o vista, utilice un archivo de formato para especificar que se debe omitir la columna de identidad de la tabla o vista al importar los datos; SQL Server asigna automáticamente valores únicos para la columna. Para obtener más información, consulte DBCC CHECKIDENT.
Keepnulls
Especifica que las columnas vacías deben conservar un valor NULL durante la operación de copia masiva, en vez de tener valores predeterminados para las columnas insertadas.
KILOBYTES_PER_BATCH [ = kilobytes_per_batch ]
Especifica el número aproximado de kilobytes (KB) de datos por lote (como kilobytes_per_batch). De forma predeterminada, el valor de KILOBYTES_PER_BATCH es desconocido.
LASTROW [ = last_row ]
Especifica el número de la última fila que se va a copiar. El valor predeterminado es 0, que hace referencia a la última fila del archivo de datos especificado.
MAXERRORS [ = max_errors ]
Especifica el número máximo de errores que pueden producirse antes de que se cancele la operación de copia masiva. Cada fila que no pueda importarse con la operación de copia masiva se pasa por alto y se considera como un error. Si no se especifica el argumento max_errors, el valor predeterminado es 10.
ORDER ( { column [ ASC | DESC ] } [ ,...n ] )
Especifica la forma en que están ordenados los datos del archivo de datos. El rendimiento de la operación de copia masiva mejora si los datos cargados se ordenan según el índice agrupado de la tabla. Si el archivo de datos tiene un orden distinto o si no hay un índice agrupado en la tabla, se pasará por alto la cláusula ORDER. Los nombres de columna facilitados deben ser columnas válidas en la tabla de destino. De forma predeterminada, la operación de inserción masiva asume que los datos del archivo no están ordenados.
n
Es un marcador de posición que indica que se pueden especificar varias columnas.
ROWS_PER_BATCH [ = rows_per_batch ]
Especifica el número de filas de datos por lote (como rows_per_batch). Se utiliza cuando no se especifica BATCHSIZE y, por lo tanto, se envía el archivo de datos completo al servidor en una sola transacción. El servidor optimiza la carga de la copia masiva según el valor rows_per_batch. De forma predeterminada, el valor de ROWS_PER_BATCH es desconocido.
ROWTERMINATOR [ = 'row_terminator' ]
Especifica el terminador de fila que se va a utilizar para archivos de datos de tipo char y widechar. El valor predeterminado es \n (carácter de nueva línea).
Tablock
Especifica que se obtiene un bloqueo de tabla durante la operación de copia masiva. Varios clientes pueden cargar una tabla simultáneamente si ésta no tiene índices y se especifica TABLOCK. De forma predeterminada, el comportamiento del bloqueo viene determinado por la opción de tabla table lock on bulk load (bloqueo de tabla en cargas masivas). Al mantener un bloqueo únicamente durante la operación de copia masiva, se reducen los conflictos por bloqueo de la tabla y, por tanto, mejora notablemente el rendimiento.
Observaciones
La instrucción BULK INSERT se puede ejecutar en una transacción definida por el usuario. Si se deshace una transacción definida por el usuario que utiliza una instrucción BULK INSERT y una cláusula BATCHSIZE para cargar datos en una tabla o vista con varios lotes, se deshacen todos los lotes enviados a SQL Server.
Permisos
Sólo los miembros de las funciones fijas de servidor sysadmin y bulkadmin pueden ejecutar BULK INSERT.
Ejemplos
Este ejemplo importa información de detalle de pedidos del archivo de datos especificado mediante una canalización (|) como terminador de campo y |\n como terminador de fila.
BULK INSERT Northwind.dbo.[Order Details]
FROM 'f:\orders\lineitem.tbl'
WITH
(
FIELDTERMINATOR = '|',
ROWTERMINATOR = '|\n'
)
Este ejemplo especifica el argumento FIRE_TRIGGERS.
BULK INSERT Northwind.dbo.[Order Details]
FROM 'f:\orders\lineitem.tbl'
WITH
(
FIELDTERMINATOR = '|',
ROWTERMINATOR = ':\n',
FIRE_TRIGGERS
)
Véase también
Herramienta bcp
Intercalaciones
Copiar datos entre distintas intercalaciones
Copiar datos mediante bcp o BULK INSERT
Cargas de datos en paralelo
sp_tableoption
Utilizar archivos de formato
O tal vez en la siguiente liga localices algo que te ayude:
http://www.sqlmax.com
Pero se podría hacer de alguna manera sin utilizar el bulk sino con otro comando o un procedimiento almacenado o cualquier otra cosa. Muchas Gracias
Lo que hago con este tipo de problemas, es programar una pequeña aplicación de lectura de datos en visual basic y de ahí partir para insertar los datos, a la vez, la aplicación detecta alguno de los errores que comentas y se brinca o salta el registro de datos en cuestión.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas