SSIS de datos OLE DB Fuente de flujo: la salida de una columna que puede tener diferentes longitudes

StackOverflow https://stackoverflow.com/questions/4198220

Pregunta

He creado un paquete SSIS para que pueda importar datos de una base de datos existente de FoxPro a intervalos programados. Una copia de la FoxPro databaseis instalado por varios clientes. En general, el paquete está funcionando muy bien y llevar a cabo todo lo que necesito.

Sin embargo, tengo una situación molesta, donde al menos un cliente (tal vez más) tiene una base de datos FP modificado, en el que aumentaron la longitud de una columna en una tabla. Cuando ejecuto el paquete en un cliente tal, se produce un error debido a truncamiento.

pensé que sólo yo podía dar un margen de maniobra y cambiar la longitud de 3 a 10. De esta manera se acomoda los mutantes con una longitud de 10, así como todos los demás usando 3. Sin embargo, SSIS se queja cuando la columna longitudes no coinciden, y punto.

supongo que tengo algunas opciones:

  1. En la tarea, set de 'ValidateExternalMetadata' false. Sin embargo, no estoy seguro de que es la opción más responsable ... o es?
  2. Obtener nuestro equipo de aplicación para cambiar la longitud a 10 para todos los clientes. Esto podría ser un problema, pero al menos sería su problema.
  3. Crear una copia de la tarea que funcione para soluciones con la diferente longitud de la columna. Aplicación es probable que utilice el paquete equivocado en algún momento, y todo el mundo me pregunta por qué no sólo les dan un solo paquete que no podía manejar todos los escenarios y culpar de esto a mí.
  4. Utilice otro enfoque que podría ser capaz de rellenar sucesivamente.
¿Fue útil?

Solución

Si está utilizando Visual FoxPro OleDB, y usted está preocupado por los anchos de las columnas, se puede forzar explícitamente mediante el uso de EPRD () durante la llamada. No sé cuántos Tablas / Consultas esto afecta pero garantizaría obtiene sus longitudes de columnas de caracteres esperados. Si se trata de numérico, decimal, fecha / hora, lógico (booleano), no debería ser un problema ... De todos modos, se puede hacer esto como su selección para obtener los datos

select 
      t1.Fld1,
      t1.Fld2,
      padr( t1.CharFld3, 20 ) CharFld3,
      padr( t1.CharFld4, 5 ) CharFld4,
      t1.OtherFld5,
      padr( t1.CharFld6, 35 ) CharFld5
   from
      YourTable t1
   where
      SomeCondition

Esto obligará a base campos de caracteres (muestra implícita) "CharFld3", "CharFld4", "CharFld6" a un ancho de fuerza de 20, 5 y 35, respectivamente, independientemente de la duración estructura subyacente. Ahora, si alguien actualiza la estructura más larga de lo que lo tienes se truncará hasta una longitud adecuada, pero no se bloqueará. Además, si tienen una longitud de columna más corta, se rellena a tamaño completo se especifica mediante la función de EPRD () (pad derecho).

Otros consejos

soy débil en el lado FoxPro, pero ...

Se puede crear una tabla temporal que cumpla con las expectativas de SSIS. Crear una tarea que utilice las instrucciones de FoxPro para copiar los datos de la tabla problema a la tabla temporal. Alterar su flujo de datos para trabajar con la tabla temporal.

Puede crear los pasos preliminares (Crear tabla temporal y traslado tabla temporal) como tareas SSIS por lo que el control de flujo es dirigido por su paquete de SSIS.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top