2011-06-19 20 views
11

Quiero insertar muchas filas (construidas desde objetos Entity Framework) a SQL Server. El problema es que algunas de las propiedades de cadena tienen una longitud que excede la longitud de la columna en la base de datos, lo que causa una excepción y, luego, todas las filas no podrán insertarse en la base de datos.Cómo truncar automáticamente la cadena cuando se realiza una inserción masiva?

Así que me pregunto si hay una forma de decirle a SqlBulkCopy que trunque automáticamente cualquier fila de longitud excesiva. Por supuesto, puedo verificar y subscribir cada propiedad si excede la longitud limitada, antes de insertarla en una DataTable, pero ralentizaría todo el programa.

Respuesta

7

Desafortunadamente no hay directa forma de hacerlo con SqlBulkCopy. Las inserciones SQL a granel son casi "tontas" por naturaleza, pero es por eso que son tan rápidas. Ni siquiera están registrados (excepto capturar el evento SqlRowsCopied) por lo que si algo falla, no hay mucha información. Lo que usted está buscando haría en cierto modo, ser contraria a la finalidad de esta clase

Pero no puede haber 2 maneras posibles:

  • puede intentar utilizar SqlBulkCopyOptions Enumeración (pasó a SqlBulkCopy() Constructor) y use SqlBulkCopyOptions.CheckConstraints (Verifique las restricciones mientras se están insertando los datos. De manera predeterminada, las restricciones no se verifican).

  • O puede utilizar SqlBulkCopyOptions.FireTriggers Enumeración (Cuando se especifica, hacer que el servidor se disparó el inserto disparadores para las filas que se insertan en la base de datos.) Y manejar la excepción en SQL Server Insert Trigger.

+1

-1 El disparador se activará demasiado tarde: se produce el truncamiento antes de ejecutar el código Check todavía da una excepción también. Op está de vuelta donde comenzaron. – gbn

+1

+0.5? Con un activador INSTEAD OF INSERT, puede recortar los datos para insertar, pero una tabla de etapas es una mejor ruta. – SqlACID

9

Utilice siempre una tabla de etapas/carga para las acciones masivas.

Luego puede procesar, limpiar, restregar etc. los datos antes de enjuagarlos a la mesa real. Esto incluye, izquierdas, las búsquedas, de-duplicación etc

Así:

  1. carga una tabla de etapas con ancho columnas
  2. ras de puesta en escena de "real" de mesa utilizando INSERT realtable (..) SELECT LEFT(..), .. FROM Staging
-1

Intente utilizar SQLTransaction Class mientras usa SQLBulkCopy Class

Cuestiones relacionadas