Imagine una tabla con un centenar de columnas diferentes. Imagínese, entonces, que tengo una tabla de datos de usuario desde donde quiero copiar datos a la tabla base. Así que escribí esta simple instrucción insertar-seleccionar y este error aparece. Entonces, ¿cuál es la forma más elegante de averiguar qué columna plantea el error?¿Cómo saber qué columna genera un error de desbordamiento aritmético al insertar?
Mis pensamientos iniciales sobre la solución están a punto de envolverlo en una transacción que voy a deshacer en última instancia, y el uso de una especie de Divide y vencerás:
begin tran
insert into BaseTable (c1,c2,c3,...,cN)
select c1,c2,c3,...,cN
from UserTable
rollback tran
Y esto falla, obviamente. Así dividimos el conjunto de columnas en la mitad de este modo:
begin tran
insert into BaseTable (c1,c2,c3,...,cK) --where K = N/2
select c1,c2,c3,...,cK --where K = N/2
from UserTable
rollback tran
Y si falla, entonces la columna no está en la otra mitad. Y continuamos el proceso, hasta que encontremos la molesta columna.
¿Algo más elegante que eso?
Nota: También encontré un casi duplicado de esta pregunta, pero apenas lo responde.
Si hace coincidir los tipos de datos de UserTable con los de BaseTable, su inserción no debería tener ningún problema. Todo lo que se necesita después de eso es encontrar la columna ofensiva * UserTable *. –
@Lieven Bueno, UserTable es solo eso ... una tabla de usuario sin restricciones, porque los datos que contiene son de Excel o Access o lo que sea. –
Me solidarizo. Si esto es algo que debe hacerse de manera regular, ¿no podría crear un script/procedimiento almacenado que verifique sus entradas? Una macro y una simple selección llegarían muy lejos, algo así como 'SELECCIONAR' c1 ', CAST (c1) COMO INTEGER FROM UserTable'. –