Tipos de datos SSIS vs SQL Server: tabla de equivalencias y errores comunes

Written by

in

SSIS (SQL Server Integration Services) maneja su propio sistema de tipos de datos internamente, distinto al de SQL Server — cuando un paquete SSIS lee o escribe datos de una tabla, el motor de flujo de datos convierte automáticamente entre ambos sistemas. Conocer esta tabla de equivalencias es clave para evitar truncamientos silenciosos, pérdida de precisión, o errores de conversión que aparecen solo en tiempo de ejecución.

Tabla de equivalencias

Tipo SSISExpresión SSISEquivalente en SQL Server
Entero con signo de 1 byte(DT_I1)— (sin equivalente directo)
Entero con signo de 2 bytes(DT_I2)smallint
Entero con signo de 4 bytes(DT_I4)int
Entero con signo de 8 bytes(DT_I8)bigint
Entero sin signo de 1 byte(DT_UI1)tinyint
Entero sin signo de 2 bytes(DT_UI2)— (sin equivalente directo)
Entero sin signo de 4 bytes(DT_UI4)— (sin equivalente directo)
Entero sin signo de 8 bytes(DT_UI8)— (sin equivalente directo)
Flotante(DT_R4)real
Flotante de doble precisión(DT_R8)float
Cadena de texto(DT_STR, «longitud», «code_page»)char, varchar
Texto Unicode(DT_WSTR, «longitud»)nchar, nvarchar, sql_variant, xml
Fecha(DT_DATE)date
Booleano(DT_BOOL)bit
Numérico(DT_NUMERIC, «precisión», «escala»)decimal, numeric
Decimal(DT_DECIMAL, «escala»)decimal
Moneda(DT_CY)smallmoney, money
Identificador único(DT_GUID)uniqueidentifier
Flujo de bytes(DT_BYTES, «longitud»)binary, varbinary, timestamp
Fecha de base de datos(DT_DBDATE)date
Hora de base de datos(DT_DBTIME)— (sin equivalente directo)
Hora de base de datos con precisión(DT_DBTIME2, «escala»)time(p)
Timestamp de base de datos(DT_DBTIMESTAMP)datetime, smalldatetime
Timestamp con precisión(DT_DBTIMESTAMP2, «escala»)datetime2
Timestamp con zona horaria(DT_DBTIMESTAMPOFFSET, «escala»)datetimeoffset(p)
Timestamp de archivo(DT_FILETIME)— (sin equivalente directo)
Imagen(DT_IMAGE)image
Flujo de texto(DT_TEXT, «code_page»)text
Cadena Unicode larga(DT_NTEXT)ntext

Cómo usar estas expresiones en un Derived Column

Estas notaciones ((DT_WSTR, 50), (DT_I4), etc.) se usan directamente como operadores de conversión (cast) dentro de expresiones de SSIS — típicamente en un componente Derived Column del Data Flow:

(DT_WSTR, 50) [NombreColumna]
(DT_I4) [CodigoTexto]
(DT_NUMERIC, 18, 2) [MontoTexto]

El operador se coloca entre paréntesis, antepuesto a la columna o expresión a convertir — funciona de forma similar a un CAST() en T-SQL, pero con la sintaxis propia del lenguaje de expresiones de SSIS.

Errores comunes al trabajar con estos tipos

1. Truncamiento silencioso de strings

(DT_WSTR, «longitud») y (DT_STR, «longitud») requieren especificar una longitud fija. Si el dato origen es más largo que la longitud declarada, SSIS trunca el valor sin lanzar error por defecto — a menos que se configure explícitamente el comportamiento de «truncation» del componente como Fail Component en vez de Ignore Failure. Es una causa muy común de datos incompletos en destino que pasan desapercibidos durante meses.

2. DT_STR vs DT_WSTR: ANSI vs Unicode

DT_STR corresponde a cadenas ANSI (require especificar code_page, la página de códigos) y se destina a columnas char/varchar. DT_WSTR es Unicode (UTF-16 interno) y corresponde a nchar/nvarchar. Usar el tipo equivocado entre estos dos es una fuente frecuente de errores de conversión o de caracteres especiales (acentos, ñ) que se corrompen al pasar de un sistema a otro.

3. Precisión y escala en DT_NUMERIC / DT_DECIMAL

Al convertir hacia (DT_NUMERIC, «precisión», «escala»), ambos parámetros son obligatorios y deben coincidir (o ser compatibles) con la columna destino en SQL Server. Una precisión insuficiente trunca los decimales o genera un error de overflow si el valor origen excede el rango declarado.

4. DT_DBTIMESTAMP vs DT_DBTIMESTAMP2: rango y precisión

datetime (mapeado desde DT_DBTIMESTAMP) tiene menor precisión de fracciones de segundo y un rango de fechas más limitado que datetime2 (mapeado desde DT_DBTIMESTAMP2). Si el origen de datos maneja fechas fuera del rango de datetime (años anteriores a 1753) o requiere mayor precisión de milisegundos, es necesario usar explícitamente DT_DBTIMESTAMP2 y una columna destino datetime2.

5. Tipos sin equivalente directo

Varios tipos SSIS (DT_I1, DT_UI2, DT_UI4, DT_UI8, DT_DBTIME, DT_FILETIME) no tienen un tipo equivalente exacto en SQL Server. Al mapear estas columnas hacia una tabla destino, es necesario elegir el tipo SQL Server más cercano que pueda contener el rango completo de valores sin pérdida — por ejemplo, un DT_UI4 (entero sin signo de 4 bytes, rango 0 a ~4.29 mil millones) requiere un bigint en SQL Server, ya que int es signado y no cubre ese rango completo.

Buena práctica: validar el mapeo antes de ejecutar en producción

Antes de dar por válido un flujo de datos SSIS con conversiones de tipo, conviene ejecutar el paquete contra un subconjunto de datos «límite» (valores máximos de longitud, fechas extremas, números con la mayor cantidad de decimales esperada) para confirmar que ninguna conversión trunca o falla silenciosamente antes de correrlo contra la carga completa en producción.