Pregunta

Tengo un archivo plano de origen con valores como 24.209991, pero necesitan cargarse en SQL Server como Tipo de dinero. En el DTS (del que estoy convirtiendo), ese valor se presenta como 24.21. ¿Cómo convierto ese campo en SSIS?

En este momento, solo estoy cambiando el tipo de DT_STR a DT_CY, y da un error de ejecución de 'La conversión de datos falló. La conversión de datos para la columna "Col003" devuelve el valor de estado 2 y el texto de estado "El valor no se pudo convertir debido a una posible pérdida de datos". "

¿Utilizo una tarea de conversión de datos? ¿Y entonces que?

También intenté configurar la columna de salida de origen en dt_numeric, y luego convertirla a dt_cy, con el mismo resultado.

También he intentado usar columnas derivadas, lanzar el campo DT_STR COL003 a (DT_NUMERIC, 10,2) Col003 y luego lanzarlo a (DT_CY) COL003_NUMERIC. Eso es recibir un error de reparto.

¿Fue útil?

Solución

El archivo plano predeterminado es que todos los campos son DT_STR. Use la opción avanzada para editar la conexión para tener el campo numérico como flotante (DT_R4). Luego, en la edición avanzada de la fuente de archivo plano (en la pestaña Flujo de datos), establezca esa columna de salida al dinero (DT_CY).

Luego, el campo se convertirá sin conversiones adicionales. El problema era dejar la definición del archivo de origen como dt_str.

Otros consejos

Si no tiene ninguna conversión de datos de uso de valor nulo y asegúrese de no tener ningún carácter divertido (por ejemplo, un error de productos de $ 200)

Si tiene campos nulos o vacíos en su campo y está utilizando una fuente de archivo plano, asegúrese de marcar "devolver el valor nulo de la fuente ..."

Otro truco que he usado es algo como: (taxvalue != "" ? taxvalue : NULL(DT_WSTR,50)). En la transformación de columna derivada (solo puede reemplazar el campo)

En general, SSIS no convierte las cadenas vacías en dinero correctamente.

Por alguna razón en mi escenario, el OLE DB Destination Realmente estaba configurado para aceptar un DT_CY. Sin embargo, el lanzamiento a este formato (no importa la longitud de los datos de entrada y destino, y no importa si los datos fueron NULL Cuando llegó) siempre causó el mismo problema.

Después de agregar espectadores de datos, puedo concluir que esto tiene algo que ver con el local. Aquí en Dinamarca, usamos coma (,) como delimitadores y puntos decimales (.) como miles de delimitadores, en lugar de lo contrario.

Esto significa que un gran número como 382,939,291,293.38 lo haría (después de la conversión a DT_CY) parece 382.939.291.293,38. Aunque dudaba mucho que podría ser el problema, decidí hacer el opuesto de lo que originalmente había pretendido.

Decidí ir a la configuración avanzada de mi OLE DB Destination y cambiar el DT_CY Tipo de columna para DT_STR en cambio. Entonces, agregué un Derived Column transformación e ingresó la siguiente expresión para transformar la columna antes de Los datos llegarían al destino.

REPLACE(SUBSTRING(Price, 2, 18), ",", ".") dónde Price era el nombre de la columna.

Para mi gran sorpresa, esto resolvió el problema, ya que descubrí que mi OLE DB Destination Ahora estaba enviando los datos como una cadena, que el servidor SQL entendía perfectamente bien.

¡Estoy seguro de que este es un error! Estaba usando SQL Server 2008, por lo que podría haberse resuelto en ediciones posteriores. Sin embargo, me parece bastante crítico que una cosa tan esencial no funcione correctamente.

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