Cómo evitar errores en SQL Server al concatenar campos con valores numéricos

El operador para concatenar en SQL Server es '+', pero este operador sirve también para sumar valores.

Como es el mismo operador para las dos cosas, el analizador de consultas hace una concatenación o una suma en funcion del tipo de datos de los campos que se están tratando. Si los campos son de tipo 'string' concatena, y si se trata de campos numéricos, dos enteros, por ejemplo, suma los dos valores.

El problema viene cuando se encuentra un campo de cada tipo y el operador '+' en medio. En este caso, el motor puede devolver un error de conversión porque al encontrarse un campo numérico intenta hacer la suma y, claro, el otro campo es una cadena.
 
Por ejemplo, tenemos estos campos en una tabla TablaEmpleados:
  strNombre --> nvarchar(10)
  intEdad      --> integer
 

Si hacemos esta SELECT con SQL Server:

SELECT strNombre + ' tiene ' + intEdad + ' años'  
FROM TablaEmpleados

Nos encontraremos este mensaje de error:


Mens. 245, Nivel 16, Estado 1, Lnea 1
Error de conversion al convertir el valor nvarchar 'años' 
al tipo de datos int.

 

La solución es bastante simple, si lo que se quiere es concatenar, hay que convertir a cadena cualquier campo de tipo numérico que intervenga en la concatenación:

SELECT strNombre + ' tiene ' + cast(intEdad as varchar) + ' años'  
FROM TablaEmpleados

 

Comentar también que este problema es específico de SQL Server, ya que el operador estandar SQL para concatenar es '||', que es el que utilizan otras bases de datos como Oracle. MySQL, aunque no utiliza el estandar, concatena con la función CONCAT()

De esta manera, en ambas BBDD (Oracle y MySQL) el operador '+' se utiliza sólo para sumar, por lo que al concatenar nunca pasará que el analizador interprete que se quiere realizar una operación aritmética.

 

 

Contenido relacionado

  • Para los que estamos acostumbrados a utilizar el operador decode del SQL de Oracle sorprende bastante que no esté incluída en la sintaxis que se puede utilizar dentro del generador de expresiones de Oracle Warehouse Builder.

    Pero todo tiene solución. Si para un campo se quiere seleccionar un valor en función del contenido de otro o más campos, se puede utilizar el objeto EXPRESSION, conectar en la entrada todos los campos implicados, y en la expresión del campo de salida olvidarnos del DECODE y utilizar en su lugar un CASE WHEN ..., que sí está soportado.

    Por ejemplo:
    CASE WHEN entrada1 = 0 THEN 'Falso'
            WHEN entrada2 = 1 THEN 'Cierto'
            ELSE 'Indefinido'
    END

  • Hola

     

    cordial saludo,

     

    bueno nuevamente con dudas y algunos problemas en el mapeo de datos.

     

    A ver tengo el siguente problema, he creado un mapa para el cual la tabla destino tiene un campo PK (secuencia)y tres campos me representan un constraint unique, para la asignacion del pk no se hace uso del NEXTVAL para obtener el ultimo valor de la secuencia. Para esto sean definido los valores de secuencia 

    en una tabla tabla_secuencia. el problema se me esta presentando cuando corrro el mapa pues me aparece el error ora-00001 violation unique constraint para ambos casos pk y el unique de los tres campos.  Para verificar este error he realizado una revision en los valores almacenados en la tabla_secuencia buscando si ya existen valores asignados en la tabla destino, pero en esta situación este no es el problema los valores de secuencia existentes en la tabla_secuencia no presentan conflicto. para la asignacion de los valores de secuencia se ha definido una funcion que me retorna el valor de secuencia correspondiente una vez este es asignado en la tabla destino mediante un trigger se elemina el valor de la tabla_secuencia.

  • Dentro de los informes de Cognos, cuando se definen filtros, aunque la mayoría de las condiciones se pueden expresar con SQL estandard, resulta que cuando quieres comparar un valor con una lista, es decir, cuando quieres utilizar el operador IN, la sintaxis no es la misma que la de SQL.

    En lugar de la coma que separa los diferentes valores hay que poner un punto y coma.

    Ejemplo:

    • La condición que en SQL sería:
        WHERE campo IN ('valor_1', 'valor_2', 'valor_n')
    • En un filtro de Cognos Report Studio se ha de poner como
        [campo] IN ('valor_1' ; 'valor_2' ; 'valor_n')
    • Y si estamos filtrando miembros de una dimensión o jerarquía tenemos que utilizar también una sintaxis diferente
        [nivel_jerarquia] IN ([miembro_1] , [miembro_2] , [miembro_n])

    Es algo muy tonto, pero si no lo sabes puede llegar a desesperarte bastante..

  • El error ORA-30926 suele producirse cuando se realizan operaciones Merge, y lo normal es que nos deje algo descolocados, ya que la descripción del mismo no da demasiada información sobre lo que está pasando:
    ORA-30926: unable to get a stable set of rows in the source tables.

    Normalmente este error se produce cuando en la operación Merge a una fila destino que hay que actualizar le corresponden más de una fila en la tabla origen. Como el motor no sabe qué registro escoger devuelve un error. Es un problema de duplicidad en la tabla origen...

  • En Oracle, para crear fácilmente una tabla a partir de una consulta SQL se puede utilizar la siguiente sentencia:

    CREATE TABLE NuevaTabla AS (SELECT * FROM OtraTabla);

    Este tipo de sentencia se conoce como Create Table As Select (CTAS). Es muy útil para hacer pruebas rápidas con datos, para crear tablas de muchos campos que se parecen mucho a otras, o para 'materializar' una vista creando una tabla a partir de la select sobre la vista.

     

    El caso es que en SQL Server también se puede hacer lo mismo, pero la sintaxis cambia bastante, y para el que esté más acostumbrado a la de Oracle puede serle útil saber que con SQL Server, para crear una tabla a partir de una sentencia SQL se puede utilizar una instrucción como esta:

    SELECT * INTO NuevaTabla FROM OtraTabla;

     

 

 

 

Gestion del Conocimiento    |    Business Intelligence y Analítica    |     Bases de Datos    |      ERP     |      CRM      |     Tendencias tecnológicas