Conversiones implícitas en SQL Server

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:

create table #pruebas (idCargo varchar(50),nombre varchar(50));

insert into #pruebas values
   
(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:

insert into #pruebas values
   
(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 🙁

 

 

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *