none
tengo dos bases dedatos y quiero generar una actualizacion de uno del otro el procedimieto es el siguiente RRS feed

  • Pregunta

  • ALTER procedure [dbo].[sp_prueba_actualizar3]
    as
    begin
    declare @id_zona char (10)
    declare @cantidad decimal (13)
    declare @vr_bruto money
    declare @vr_neto money

    set @id_zona = (select id_zona from reymon.dbo.periodo_fac );
    set @cantidad = (select cantidad from reymon.dbo.periodo_fac);
    set @vr_bruto = (select vr_bruto from reymon.dbo.periodo_fac);
    set @vr_neto = (select vr_neto from reymon.dbo.periodo_fac);

        update DWH.dbo.periodo_fac 
    set   cantidad=(@cantidad), vr_bruto=(@vr_bruto), vr_neto=(@vr_neto)
    where id_zona = (@id_zona)
    end

    el error es el siguiente

    Msg 512, Level 16, State 1, Procedure sp_prueba_actualizar3, Line 9 [Batch Start Line 24]
    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.
    Msg 512, Level 16, State 1, Procedure sp_prueba_actualizar3, Line 10 [Batch Start Line 24]
    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.
    Msg 512, Level 16, State 1, Procedure sp_prueba_actualizar3, Line 11 [Batch Start Line 24]
    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.
    Msg 512, Level 16, State 1, Procedure sp_prueba_actualizar3, Line 12 [Batch Start Line 24]
    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.

    • Editado andres_fff miércoles, 9 de noviembre de 2016 22:01
    miércoles, 9 de noviembre de 2016 22:00

Respuestas

  • Hola:

    El error es que en una asignacion a una variable "SET @Id_zona = " solo le puedes asignar un valor (lógico por otra parte), y el select devuelve MAS de un registro (SELECT Id_Zona FROM reymon.dbo.periodo_fac);

    Para evitarlo, la lógica de tu programa tiene que hacer que el SELECT devuelve 0 o 1 registros, sino te dará error siempre. Lo normal es:

    SET @Id_Zona = (SELECT Id_Zona FROM ... WHERE <condicion que devuelve un solo registro>);

    Otra soluciones mas peligrosas son hacer:

    SET @Id_Zona = (SELECT DISTINCT Id_Zona ...)

    SET @Id_Zona = (SELECT TOP 1 Id_Zona ...)

    Obviamente, lo mismo para las otras variables (@Cantidad, @Vr_Bruto, @Vr_Neto), espero que te sirva.

    Un saludo

    jueves, 10 de noviembre de 2016 8:58