Un colaborador de The Daily WTF, John F., relata una migración que falló de forma sutil. Su empresa había vendido parte del negocio y debía entregar documentos de clientes y sus metadatos, almacenados en un SharePoint local. El plan: extraer los metadatos a una base de datos SQL Server.

Un colega había empezado con la herramienta ETL de Microsoft, SSIS, que generó el esquema de la base de datos. John cambió a PowerShell para tener más control y usó System.Data.SqlClient.SqlBulkCopy por velocidad, lo que obligaba a declarar tipos de datos .NET exactos en su script.

Uno de los campos era el número de cliente: hasta diez dígitos, a menudo con dos ceros iniciales. Alguien lo había guardado tiempo atrás en un campo Number de SharePoint, que internamente es un Double. La doble precisión representa con exactitud números de diez dígitos, así que hasta ahí sin problema. La trampa estaba en el nombre. En SQL Server el tipo de doble precisión se llama float; para precisión simple hay que escribir float(24). John no lo sabía y mapeó la columna float al tipo float de .NET, es decir, precisión simple.

Los doubles que salían de SharePoint se truncaban silenciosamente al insertarse. La mayoría de los registros sobrevivieron, pero a los números de cliente grandes se les alteraron los últimos dígitos. Los testers no se dieron cuenta. La carga completa sí. El equipo tuvo que generar una lista de los números modificados y corregir los datos a posteriori. La moraleja: de plataforma Microsoft a plataforma Microsoft con herramientas Microsoft, y aun así los nombres de los tipos le jugaron la mala pasada.