Una de las novedades que Sql Server 2008 trajo en su día fue la capacidad de poder pasar listas de valores a una instrucción Insert Into sin tener que unirlos en una tabla mediante UNION. El siguiente código es totalmente correcto:
(0,‘Persona_1’),
(‘1’,‘Persona_2’),
(»,‘Persona_3’);
Fíjate que estamos insertando en una tabla con dos columnas tipo texto distintos valores, como son un número, un caracter y un texto sin contenido. El resultado es el siguiente:
Lo que nos debería de preocupar de este resultado es la fila 3. Se puede observar que se ha convertido la cadena vacía a un 0, lo cual significa que ha utilizado la conversión implícita desde varchar a integer. Este efecto puede tener consecuencias desastrosas, cómo en este otro ejemplo:
(0,‘Persona_1’),
(‘1’,‘Persona_2’),
(‘a’,‘Persona_3’);
Este «inocente» script hace que salte una excepción
«Msg 245, Level 16, State 1, Line 3 Error de conversión al convertir el valor varchar ‘a’ al tipo de datos int.»
¡¡¡Se está quejando de que no puede convertir el texto a número cuando estamos insertando textos en un campo de texto!!!
El motivo es que en la primera fila estamos insertando un int, e internamente Sql Server va a tratar de crear una tabla para los tres valores con la estructura que define esa primera fila, en nuestro caso un entero en la primera columna y un varchar en la segunda 🙁