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)