none
La subconsulta ha devuelto más de un valor, lo que no es correcto cuando va a continuación de =, !=, <, <=, >, >= o cuando se utiliza como expresión. RRS feed

  • Pregunta

  • Al ejecutar esta consulta para insertar nuevos registros compuestos por otras columnas de la misma tabla en una columna nueva sale ese error:

    La subconsulta ha devuelto más de un valor, lo que no es correcto cuando va a continuación de =, !=, <, <=, >, >= o cuando se utiliza como expresión. 

    update Persona set CvePropuesta = 
    (select ((upper(left(Nombre, 2)))+''+(left(ApellidoP, 1))+''+(left(ApellidoM, 1))+'-'+(cast(Cve_Empleado as char)))
    from Persona)

    donde CvePropuesta debe ser compuesta por las dos primeras letras en mayusculas del nombre, más la primera letra del apellido paterno, más la primera letra del apellido materno, más un guion (-), mas la clave del empleado (es int pero se tiene que convertir en char)

    domingo, 15 de abril de 2018 3:52

Respuestas

  • Se me había pasado, que estas haciendo una update contra un registro, pero en el select te traes todas las personas, cuando debiera ser la que quieres updatear.

    Perdón, además la sentencia debiera ser tal que así:

    declare @id int = 100;
    update Persona set CvePropuesta = 
    	(select ((upper(left(Nombre, 2)))+''+(left(ApellidoP, 1))+''+(left(ApellidoM, 1))+'-'+(cast(Cve_Empleado as varchar(15))))
    		from Persona where identificadorUnico = @id)

    Un saludo

    • Marcado como respuesta Leo Est domingo, 22 de abril de 2018 19:57
    domingo, 15 de abril de 2018 6:49
  • Con tu escenario más o menos.

    Pero si tu intención era la de inicializar ese campo para todos los registros puede ser así

    CREATE TABLE PERSONA (ID INT IDENTITY (1,1), NOMBRE VARCHAR(10), APELLIDOP VARCHAR(10), APELLIDOM VARCHAR(10), CVE_EMPLEADO INT, CVEPROPUESTA VARCHAR(15))
    GO
    
    
    INSERT INTO PERSONA (NOMBRE, APELLIDOP, APELLIDOM, CVE_EMPLEADO, CVEPROPUESTA) VALUES
    ('RAMON','FERNANDEZ', 'MARTINEZ',15,''),
    ('ANA','GUTIERREZ', 'CALVO',11,''),
    ('SILVIA','GONZALEZ', 'FERNANDEZ',1,''),
    ('ARTURO','OSTIZ', 'PIEDRA',12,'')
    
    update Persona set CvePropuesta = 
    (upper(left(Nombre, 2)))+''+(left(ApellidoP, 1))+''+(left(ApellidoM, 1))+'-'+(cast(Cve_Empleado as varchar(15)));
    	
    	
    SELECT * FROM PERSONA

    Un saludo
    • Marcado como respuesta Leo Est domingo, 22 de abril de 2018 19:57
    domingo, 15 de abril de 2018 6:56

Todas las respuestas

  • Hola Leo Est:

    Supongo que tu error esta en cast(Cve_Empleado as char) porque char es un tipo de datos fijo, con una longitud de n carácteres, por tanto al no haber expresado la longitud.....

    https://docs.microsoft.com/es-es/sql/t-sql/data-types/char-and-varchar-transact-sql

    Yo cambiaría tu sentencia como cast (Cve_empleado as varchar(15)), entendiendo que quieres grabar algo como.

    RAFM15 (RAMON FERNANDEZ MARTINEZ EMPLEADO 15)

    SIGF1 (SILVIA GONZALEZ FERNANDEZ EMPLEADA 1)

    Un saludo

    domingo, 15 de abril de 2018 5:58
  • Se me había pasado, que estas haciendo una update contra un registro, pero en el select te traes todas las personas, cuando debiera ser la que quieres updatear.

    Perdón, además la sentencia debiera ser tal que así:

    declare @id int = 100;
    update Persona set CvePropuesta = 
    	(select ((upper(left(Nombre, 2)))+''+(left(ApellidoP, 1))+''+(left(ApellidoM, 1))+'-'+(cast(Cve_Empleado as varchar(15))))
    		from Persona where identificadorUnico = @id)

    Un saludo

    • Marcado como respuesta Leo Est domingo, 22 de abril de 2018 19:57
    domingo, 15 de abril de 2018 6:49
  • Con tu escenario más o menos.

    Pero si tu intención era la de inicializar ese campo para todos los registros puede ser así

    CREATE TABLE PERSONA (ID INT IDENTITY (1,1), NOMBRE VARCHAR(10), APELLIDOP VARCHAR(10), APELLIDOM VARCHAR(10), CVE_EMPLEADO INT, CVEPROPUESTA VARCHAR(15))
    GO
    
    
    INSERT INTO PERSONA (NOMBRE, APELLIDOP, APELLIDOM, CVE_EMPLEADO, CVEPROPUESTA) VALUES
    ('RAMON','FERNANDEZ', 'MARTINEZ',15,''),
    ('ANA','GUTIERREZ', 'CALVO',11,''),
    ('SILVIA','GONZALEZ', 'FERNANDEZ',1,''),
    ('ARTURO','OSTIZ', 'PIEDRA',12,'')
    
    update Persona set CvePropuesta = 
    (upper(left(Nombre, 2)))+''+(left(ApellidoP, 1))+''+(left(ApellidoM, 1))+'-'+(cast(Cve_Empleado as varchar(15)));
    	
    	
    SELECT * FROM PERSONA

    Un saludo
    • Marcado como respuesta Leo Est domingo, 22 de abril de 2018 19:57
    domingo, 15 de abril de 2018 6:56
  • La subconsulta ha devuelto más de un valor [...]

    Siempre que te salga ese error, indica que estás intentando guardar varias cosas en el sitio donde solo cabe una cosa.

    En este caso, tu sentencia es de este tipo:

    update Persona set CvePropuesta = (algo)

    Dado que CvePropuesta es un nombre de campo, en ese campo solo se puede guardar un valor. Al ver el mensaje de error, se infiere que ese "(algo)" devuelve más de un valor.

    Y examinando el "(algo)" vemos que es una Select, y que no tiene un "where", por lo que va a devolver todos los registros de la tabla, que en general serán más de uno y en consecuencia no cumplen la regla de que solo se puede devolver un único valor para meterlo en CvePropuesta.

    La solución es ponerle un "where" a la "select" de tal manera que solo exista un único registro que cumpla ese "where". El valor concreto a poner en el where dependerá de cuál sea el objetivo a conseguir, y requiere conocimiento de las tablas y cómo están organizadas y qué datos tienen.

    domingo, 15 de abril de 2018 15:29
  • Me ha funcionado excelente Javi, saludos y mil gracias
    domingo, 22 de abril de 2018 19:58