none
Ayuda con proceso SQL RRS feed

  • Pregunta

  • Ayuda, tengo un problema con la sintaxis de un procedimiento en SQL. Cuando lo meto en C# en vez de editar la entrada agrega como si fuera una nueva.

    ALTER proc [dbo].[Area_Editar]
    @AreaRegistrada varchar (100)
    as
    if not exists (select Area From TablaArea where Area =@AreaRegistrada)
    insert into TablaArea (Area) values (@AreaRegistrada)
    else
    update TablaArea set Area=@AreaRegistrada where Area=@AreaRegistrada
    Hay un error en el codigo, pero no se cual es exactamente.


    jueves, 26 de enero de 2017 23:52

Respuestas

  • Hola estas tratando de actualizar a un valor que también es el mismo que estás buscando, deberías tener in id en la tabla para modificar por ese campo,debes definir si la tabla tiene un campo autonumérico para hacer el insert como lo estás haciendo o como generarás el id

    ALTER proc [dbo].[Area_Editar]
    @AreaRegistrada varchar (100),
    @AreaId Int
    as
    if not exists (select Area From TablaArea where Area =@AreaRegistrada)
    insert into TablaArea (Area) values (@AreaRegistrada)
    else
    update TablaArea set Area=@AreaRegistrada where AreaId=@AreaId


    Si la respuesta te fue útil vótala como tal,y si fue respuesta márcala. Solo dejo en el foro mis post si fueron útiles , de lo contrario y por mantener el orden los borro. Saludos. Lima-Perú.



    • Editado Augusto1982 viernes, 27 de enero de 2017 1:34
    • Marcado como respuesta Alex Alfonso viernes, 27 de enero de 2017 7:02
    viernes, 27 de enero de 2017 1:32

Todas las respuestas

  • Hola estas tratando de actualizar a un valor que también es el mismo que estás buscando, deberías tener in id en la tabla para modificar por ese campo,debes definir si la tabla tiene un campo autonumérico para hacer el insert como lo estás haciendo o como generarás el id

    ALTER proc [dbo].[Area_Editar]
    @AreaRegistrada varchar (100),
    @AreaId Int
    as
    if not exists (select Area From TablaArea where Area =@AreaRegistrada)
    insert into TablaArea (Area) values (@AreaRegistrada)
    else
    update TablaArea set Area=@AreaRegistrada where AreaId=@AreaId


    Si la respuesta te fue útil vótala como tal,y si fue respuesta márcala. Solo dejo en el foro mis post si fueron útiles , de lo contrario y por mantener el orden los borro. Saludos. Lima-Perú.



    • Editado Augusto1982 viernes, 27 de enero de 2017 1:34
    • Marcado como respuesta Alex Alfonso viernes, 27 de enero de 2017 7:02
    viernes, 27 de enero de 2017 1:32
  • Tambien tenia esa idea pero no queria ingresarle otro campo a la tabla. Pero si esa es la unica opcion lo tendre que aplicar. 

    Gracias nuevamente Augusto...

    viernes, 27 de enero de 2017 7:03
  • Alex Alfonso,

    ¿La variable @AreaRegistrada contiene -en caso de una actualización- el valor a actualizar?, de ser así y teniendo claro que ese valor aún no existe en la base de datos el predicado EXISTS lo resolverá como FALSE, por tanto el flujo en cualquier caso ingresará a ejecutar la instrucción INSERT.

    Desde mi punto de vista tienes dos opciones:

    - Agregar una columna que identifique unívocamente a cada fila de la tabla (recomendado)

    ALTER PROCEDURE [dbo].[Area_Editar]
        @AreaId int,
        @AreaRegistrada varchar (100)    
    AS
    BEGIN
        IF NOT EXISTS (SELECT Area FROM TablaArea WHERE AreaId = @AreaId)
    	   INSERT INTO TablaArea (Area) VALUES (@AreaRegistrada)
        ELSE
    	   UPDATE TablaArea SET Area = @AreaRegistrada WHERE AreaId = @AreaId
    END

    - Si por alguna restricción no puedes agregar una columna entonces el procedimiento debe obtener información del valor actual y el valor modificado:

    ALTER PROCEDURE [dbo].[Area_Editar]    
        @AreaRegistradaActual varchar (100),
        @AreaRegistradaModif varchar (100)
    AS
    BEGIN
        IF NOT EXISTS (SELECT Area FROM TablaArea WHERE Area = @AreaRegistradaActual)
    	   INSERT INTO TablaArea (Area) VALUES (@AreaRegistradaActual)
        ELSE
    	   UPDATE TablaArea SET Area = @AreaRegistradaModif WHERE Area = @AreaRegistradaActual
    END

    En una operación de inserción el parámetro @AreaRegistradaModif podría ser NULL.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    viernes, 27 de enero de 2017 15:18