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 SSIS | Expresión SSIS | Equivalente 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.