none
Ejecutar una funcion que ejecuta otra funcion que devuelva un valor y que despues haga inserts RRS feed

  • Pregunta

  • Buenas noches,

    Tengo una duda, estoy intentando hacer que un funcion devuelva un valor maximo y que este se guarde en una variable y que despues se inserta en la bd. Pero me da un error y no se como solucionar-lo.

    Mens 102, Nivel 15, Estado 1, Procedimiento insertar_fpago, Línea 11
    Sintaxis incorrecta cerca de '@count_max'.

    create function obtener_max_id()
    RETURNS int
    as

    begin
    declare @max integer

    Select @max = Max(id_f_pago)
    from .dbo.Tipo_f_pago 
    return @max
    end;


    /*funcion insertar nueva forma de pago*/

    create function insertar_fpago(@nombre_forma varchar(60))
    RETURNS int   
    AS   
    BEGIN 
      declare @resultado integer
      declare @count_max integer

    @count_max = dbo.obtener_max_id


      return @resultado
    end;

    martes, 8 de noviembre de 2016 4:37

Respuestas

Todas las respuestas

  • Arregla la línea del @count_max. debería ser

    SET @count_max = dbo.obtener_max_id()

    martes, 8 de noviembre de 2016 7:12
  • Para obtener el valor no tienes más que hacer lo que te propone anibal, ahora bien, no se si has pensado que esta función te puede dar duplicados si hay la suficiente concurrencia.

    imagina dos procesos ejecutándose en esta base de datos que lleguen en este orden

    proceso A, llama a la función obtenermaxid, le devuelve 145 (conexión A)

    Proceso B llama a la función obtenermaxid le devuelve 145 (conexión B)

    proceso B llama a insertar y consigue inserción

    Proceso A llama a insertar y falla por clave duplicada.

    Si no te importan los huecos, yo usaría secuencias para estas operaciones. https://msdn.microsoft.com/en-us/library/ff878091.aspx

    si te importan los huecos entonces hay que hacerlo con tabla de contadores. Select MAX(campo) siempre es una mala idea si hay suficiente concurrencia (amén del coste)


    Comparte lo que sepas, aprende lo que no sepas (FGG)
    portalSQL
    El rincón del DBA

    martes, 8 de noviembre de 2016 8:23
    Moderador
  • Muchas gracias voy a probar lo de las secuencias. Ya os dire como me va
    martes, 8 de noviembre de 2016 19:05
  • Muchas gracias, me habia olvidado del set. Jejee
    martes, 8 de noviembre de 2016 19:06