2011-01-14 13 views
6

Por lo tanto, actualmente estoy trabajando en una migración de un antiguo servidor de base de datos Advantage a SQL 2005 utilizando SSIS 2008. Una de las columnas en la base de datos anterior Advantage es MEMO. Por defecto, esto se traduce en una columna DT_TEXT. Bueno, en la nueva base de datos no necesito este gran campo, pero puedo limitarlo a algo como VARCHAR (50). Me establecido con éxito una transformación columna derivada de convertir esto con la siguiente expresión:SSIS ISNULL para vaciar la cadena

(DT_STR,50,1252)[ColumnName] 

Ahora quiero ir un paso más allá y sustituir todos los valores NULL con una cadena vacía. Esto parece bastante fácil usando una expresión ISNULL([ColumnName])?"":(DT_STR,50,1252)[ColumnName], pero el problema es que el destino de OLE DB contiene el siguiente error

No se puede convertir entre cadenas Unicode y no Unicode ...

Así que al parecer la toda la expresión ISNULL convierte el tipo de datos a cadena Unicode [DT-WSTR]. He probado una variedad de moldes sobre toda la expresión o diferentes partes, pero no puedo obtener el tipo de datos para que coincida con lo que necesito.

En primer lugar, ¿es posible convertir el tipo DT_TEXT directamente en unicode? Por lo que puedo decir, los moldes no funcionan de esa manera. Si no, ¿hay alguna manera de hacer que una expresión funcione para que los valores NULL se conviertan en cadenas vacías?

¡Gracias por toda su ayuda!

Respuesta

0

Me di cuenta de algo que funciona. Puede que no sea la mejor solución, pero funcionará para mi situación.

De mi fuente OLE DB, primero hice una columna derivada. Esto usé el ISNULL que terminó convirtiéndolo a un tipo Unicode DT_WSTR. aunque no pude obtener conversiones para volver al tipo requerido, agregué una transformación de conversión de datos entre la columna derivada y el destino de OLE DB. Esto tomaría la cadena de entrada y la convertiría a un DT_STR. Todo esto se siente un poco molesto convirtiendo muchas veces, pero la columna no contiene ninguna información funky de la que deba preocuparme, así que supongo que funcionará.

Gracias a todos los que pensaron en la solución, y si encuentran alguna manera increíble de abordarla, estaría más que interesado.

2

Dale una oportunidad en tu columna derivada.

(DT_STR,50,1252) (ISNULL(ColumnName) ? "" : (DT_STR,50,1252) ColumnName) 

Incluye un modelo adicional con el Condicional (? :) entre paréntesis para garantizar la secuencia de procesamiento deseada. Creo que su expresión original estaba lanzando implícitamente a DT_WSTR porque "" está por defecto en DT_WSTR. Con esta nueva versión, fuerza el lanzamiento a DT_STR después de que se evalúa la expresión.

+0

Lo intenté en mis muchos intentos de lanzamiento. Incluso fui tan lejos como para hacer esto (DT_STR, 50,1252) (ISNULL (ColumnName)? (DT_STR, 1,1252) "" :(DT_STR, 50,1252) ColumnName ... todavía sin suerte. Agradezco la idea, y a menos que hice algo mal con mi casting, terminó no funcionaba –

Cuestiones relacionadas