2010-05-19 17 views
8

Tengo un paquete SSIS con un flujo de datos que toma una fuente de datos ADO.NET (solo una tabla pequeña), ejecuta una consulta de selección * y muestra los resultados de la consulta en un archivo plano (también intenté simplemente extraer el toda la tabla y no usando una selección de SQL).¿Cómo obtengo flujo de datos de SSIS para poner '0.00' en un archivo plano?

El problema es que la fuente de datos extrae una columna que es un tipo de datos Money, y si el valor no es cero, entra en el archivo de texto sin problemas (como '123.45'), pero cuando el valor es cero , aparece en el archivo plano de destino como '00 '. Necesito saber cómo volver a poner el cero inicial en el archivo plano.

He intentado varios tipos de datos para la salida (en el administrador de conexión de archivos planos), incluyendo moneda y cadena, pero esto parece no tener ningún efecto.

He intentado una declaración en mi caso de selección, así:

CASE WHEN columnValue = 0 THEN 
    '0.00' 
    ELSE 
     columnValue 
    END 

(todavía provoca' .00')

He intentado variaciones en que de esta manera:

CASE WHEN columnValue = 0 THEN 
    convert(decimal(12,2), '0.00') 
ELSE 
    convert(decimal(12,2), columnValue) 
END 

(todavía da lugar a' 0,00')

y:

CASE WHEN columnValue = 0 THEN 
    convert(money, '0.00') 
ELSE 
    convert(money, columnValue) 
END 

(resultados en' ,0000000000000000000')

Este pequeño problema tonto es matándome. ¿Alguien puede decirme cómo obtener un valor cero de la base de datos de datos de Money en un archivo plano como '0,00'?

+0

Me gustaría saber la causa de este problema - No estoy realmente cómodo con el truco de la columna derivada. – PeterX

Respuesta

9

¿Podría utilizar una columna derivada para cambiar el formato del valor? ¿Lo intentaste?

+0

¡Es una gran idea! Déjame probar eso ... – theog

+0

Bien, después de un poco de lucha (para convertir un número en una cadena), funcionó. Gracias Soo! – theog

8

Estaba teniendo exactamente el mismo problema, y ​​la respuesta de soo funcionó para mí. Envié mis datos a una transformación de columna derivada (en la caja de herramientas Transformación de flujo de datos). Agregué la columna derivada como una nueva columna del tipo de datos Unicode String ([DT_WSTR]) y usé la siguiente expresión:

Precio < 1? "0" + (DT_WSTR, 6) Precio: (DT_WSTR, 6) Precio

¡Espero que ayude!

+0

Gracias user346389 ... la inclusión de la extraña sintaxis de expresión de columna derivada de SSIS fue útil. – theog

1

Dado que está exportando a un archivo de texto, simplemente exporte los datos preformateados.

Puede hacerlo en la consulta o crear una columna derivada, sea lo que sea que le resulte más cómodo.

Elegí hacer la columna de 15 caracteres de ancho. Si importas a un sistema que espera números, esos ceros deberían ignorarse ... ¿por qué no estandarizar la longitud del campo?

Una solución simple en SQL es la siguiente:

select 
    cast(0.00 as money) as col1 
    ,cast(0.00 as numeric(18,2)) as col2 
    ,right('000000000000000' + cast(0.00 as varchar(10)), 15) as col3 
    go 

col1     col2     col3 
--------------------- -------------------- --------------- 
       .0000     .00 000000000000.00 

Sólo tiene que sustituir '0.00' con su nombre de columna y no se olvide de añadir el FROM nombre_tabla, etc ..

2

He utilizado el editor avanzado para cambiar la columna desde double-precision float a decimal y luego configurar el Scale a 2:

enter image description here

Cuestiones relacionadas