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 🙁

 

 

ASP.NET Web Forms y los nuevos selectores CSS3

Aunque no es en absoluto la mejor opción, tengo observado en programadores de ASP.NET el intento de incluir estilos en elementos buscándolos por su identificador. Siempre será una opción menos mala que la de meter el estilo en línea, pero no tan buena cómo utilizar clases CSS.

En ASP.NET Web Forms nos encontramos con una barrera adicional: no conocemos los identificadores de los elementos en tiempo de diseño. Un ejemplo sencillo, incluyo una <asp:label id=»lblPrueba»> dentro de un <asp:content> que a su vez utilizará una MasterPage, y el resultado final será que dicho elemento se me renderiza cómo <span id=»MainContent_lblPrueba»>. En ese caso si queremos aplicar un estilo CSS a dicho elemento buscándolo por id, tendremos que escribir el selector correspondiente para el id final, es decir, el que se enviará al navegador. Es evidente que un cambio en los contenedores del elemento puede dar al traste con esta feliz unión entre CSS e Id del elemento.

Aprovechando la circunstancia de que el identificador original que nosotros dimos al elemento siempre aparece al final del identificador cliente podemos utilizar el nuevo selector de CSS3 para seleccionar lo que nos interesa. En este caso nos valdría algo así:

     *[id$=lblPrueba]        { «estilos para la etiqueta lblPrueba»           }

Este selector viene diciendo: selecciona cualquier elemento (*) cuyo id termine en «lblPrueba», con lo cual asunto zanjado.

Puedes ampliar información sobre este selector y otros parecidos en esta página.