SQL Server, ideas y experiencias

Problemas y errores usando la función NULL del SSIS

por Jose Mariano Alvarez 28. octubre 2011

Por falta de tiempo he estado escribiendo poco, pero hace unos días me encontré con este problema en  SQL Server Integration Services que puede ser interesante compartir ya que la solución es simple y el problema parece ilógico.

El problema


Estaba generando un nuevo paquete donde los datos eran importados desde un AS400 a un SQL Server.

  • La columna destino en el SQL Server  era del tipo DATETIME.
  • La columna origen en el AS400 era carácter y tenía una fecha con el siguiente formato “yyyy-mm-dd”. 

Los valores nulos o inválidos de la columna eran representados con  el valor ‘0000-00-00’

Como el tipo de dato de destino era diferente al de origen me asegure que la conversión implícita que se realiza sobre esa columna funcionara correctamente. Como no se puede convertir “000-00-00” a DATETIME (o interpretar como fecha) decidí usar un componente Columna Derivada (Derived Column) para reemplazar el valor de la columna “000-00-00” por un NULL usando la siguiente expresión condicional.

(FECVTO ¡= “000-00-00”) ? FECVTO; NULL(DT_STR, 10, 1252)

Según el manual la función NULL(typespec) devuelve un valor NULL asociado al tipo de datos solicitado, por lo que esperaba que NULL(DT_STR,10,1252) me devolviera un NULL del tipo string de 10 posiciones y codepage 1252.

NULL (expresión de SSIS)
http://msdn.microsoft.com/es-es/library/ms141758.aspx

En lugar de eso obtuve el siguiente error:

For operands of the conditional operator, the data type DT_STR is supported only for input columns and cast operations. The expression "(FECVTO  ¡= “000-00-00”) ?  FECVTO ; NULL(DT_STR,10,1252)" has a DT_STR operand that is not an input column or the result of a cast, and cannot be used with the conditional operation. To perform this operation, the operand needs to be explicitly cast with a cast operator

Lo extraño de esto es que la ayuda en línea dice claramente  “devuelve un valor NULL asociado al tipo de datos solicitado” por lo que al especificar explícitamente el tipo de NULL que quería  debería devolverme el tipo de datos NULL adecuado

La solución


Parece ser que la tercera parte del operador condicional (NULL(DT_STR,10,1252)) no cumple los criterios de ser "una columna de entrada o el resultado de una conversión".  Debido a esto, se debe hacer explícitamente un CAST sobre el resultado de la función NULL.

Ésta es la sintaxis que funciona correctamente:

(FECVTO ¡= “000-00-00”) ? FECVTO; (DT_STR, 10, 1252)NULL(DT_STR, 10,1252)

Tags: ,

Artículos

Añadir comentario


(Mostrará su icono Gravatar )

  Country flag

biuquote
  • Comentario
  • Vista previa
Loading



Powered by SQL Total Consulting


View Jose Mariano Alvarez's profile on LinkedIn

 Add to Technorati Favorites 

Calendar

<<  febrero 2012  >>
lumamijuvido
303112345
6789101112
13141516171819
20212223242526
2728291234
567891011

View posts in large calendar

Locations of visitors to this page


Valid XHTML 1.0 Transitional

Valid CSS!