none
en un procedimiento almacenado ejecutar insert, update, delete, y un select RRS feed

  • Pregunta

  • Amigos me gustaria saber por favor como puedo colocar en un procedimiento almacenado los tres pasos en este caso un insert, un update, un delete, y un select segun corresponda. nose si se hace igual que en c# con el if o recorriendo un foreach ayuda plis.
    jueves, 10 de junio de 2010 22:08

Respuestas

  • :-)
    Hola,

    Sin duda puedes hacerlo, pero las buenas normas de diseño recomiendan utilizar distintos SP para cada una de las opciones. De hecho es más claro ver un código que ejecuta un SP 'insertarProducto' o 'actualizarProducto' que siempre el mismo SP con parámetros distintos.

    Particularmente te recomendaría utilizar 3 SP para la actualización y una función de tipo tabla para el SELECT.

    Saludos,


    No olvides marcar la respuesta como correcta si te ha sido de utilidad :-)

    [MS-MVP-MCTS]

    Mi Perfil MVP en: https://mvp.support.microsoft.com/profile/Lluis
    NUG: http://andorradotnet.com
    Web: http://www.ordeeno.com
    Blog: http://msmvps.com/blogs/lfranco
    Geeks: http://geeks.ms/blogs/lfranco

    viernes, 11 de junio de 2010 10:07
    Moderador
  • Muchas Gracias leandro cierro la consulta ya esta resuelto el tema, al final lo que hice separe todos los procedimientos en diferentes sp insert update y delete. de esta forma:

     CREATE Procedure SFAC_Insertar
    (
     @nFact int,
     @nombEmisor varchar(10),
     @codEmisor int,
     @codComercio int,
     @codCadena int
    )
    as
    begin
     insert into RegistroFacturas ([nFact], [nombEmisor], [codEmisor], [codComercio], [codCadena]) values (@nFact, @nombEmisor, @codEmisor, @codComercio, @codCadena)
    end
    GO

    CREATE procedure SFAC_EliminarDatos
    (
     @nFact int,
     @codEmisor int,
     @nombEmisor varchar(10),
     @codComercio int,
     @codCadena int 
    )
    as
    delete  from RegistroFacturas
     where @nFact = nFact
     and @codEmisor = codEmisor
     and @nombEmisor = nombEmisor
     and @codComercio = codComercio
     and @codCadena = codCadena

    GO

    CREATE procedure SFAC_GuardaRegistros
    (
     @nFact integer,
     @codEmisor integer,
     @nombEmisor varchar(30)
    )
    as
    begin
    select nFact NumeroFactura, codEmisor CodigoEmisor, nombEmisor NombreEmisor,codComercio CodigoComercio, nombComercio NombreComercio  from RegistroFacturas
    end
    GO

    CREATE procedure SFAC_ActualizarDatos
    (
     @nFact int,
     @codEmisor int,
     @nombEmisor varchar(10),
     @codComercio int,
     @codCadena int 

    as
    update RegistroFacturas set @codEmisor = codEmisor, @nombEmisor = nombEmisor, @codComercio = codComercio, @codCadena = codCadena
    where @nFact = nFact
    GO

    • Marcado como respuesta Aprendis24 miércoles, 16 de junio de 2010 16:03
    miércoles, 16 de junio de 2010 16:03
  • hola

    lo que debes hacer es determinar que oepracion debes lanzar en cada momento, o se tendras por un lado tu entidfad con un id, si es un alta seguro el id no existira en tu db, por lo tanto si consultas por este te dira que no esta y alli lanzas el procedure de insert

    si tienes un id y lo verificas, la db te dira que existe, por lo tanto lanzaras el procedure de update, las otras oepraciones de select y delete ya son manuales y lanzadas por una accion del usuario o proceso, o sea no necesitas verificar previamente

    te dejo unos link en donde realizo todas estas oepraciones solo que con queries simples, sin stored procedure, lo unico que deberias adaptar es la llamada al mismo que imagijno sabes como hacerlo

    ADO.NET Parte 3 Actualizaci ó n Informaci ó n Sql Server

    ADO.NET - Parte 1 - Recuperar Informaci ó n Sql Server

    [ADO.NET] Parte 5 - Ejemplos Simples Operaciones CRUD

    analzia los ejemplso como estas programadas y estudia la tecnica solo debes cambiar el query por el nombre del SP que has creado, eso es todo, las operacines son asl mismas

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    viernes, 11 de junio de 2010 0:45
  • Amigos miren busque mas info por internet y encontre una pagina super buena donde explican lo que yo necesito, miren este el codigo que llevo hasta el momento, son 3 procedimientos almacenados por separado, ahora me gustaria por favor que me indiquen como los puedo juntar

    ----------------------------------------------------------
    Actualizar Datos

    CREATE procedure SFAC_ActualizarDatos
    (
     @nFact int,
     @codEmisor int,
     @nombEmisor varchar(10),
     @codComercio int,
     @codCadena int 

    as
    update RegistroFacturas set @codEmisor = codEmisor, @nombEmisor = nombEmisor, @codComercio = codComercio, @codCadena = codCadena
    where @nFact = nFact
    GO

    ---------------------------------------------------------
    Eliminar Datos

    CREATE procedure SFAC_EliminarDatos
    (
     @nFact int,
     @codEmisor int,
     @nombEmisor varchar(10),
     @codComercio int,
     @codCadena int 
    )
    as
    delete  from RegistroFacturas
     where @nFact = nFact
     and @codEmisor = codEmisor
     and @nombEmisor = nombEmisor
     and @codComercio = codComercio
     and @codCadena = codCadena

    GO

    ---------------------------------------------------------
    Inserta Datos

    CREATE Procedure SFAC_InsertarDatos
    (
     @nFact int,
     @codEmisor int,
     @nombEmisor varchar(10),
     @codComercio int,
     @codCadena int 
    )

    as
    insert into RegistroFacturas ([nFact], [codEmisor], [nombEmisor], [codComercio], [codCadena]) values (@nFact, @codEmisor, @nombEmisor, @codComercio, @codCadena)
    GO
    ---------------------------------------------------------

    viernes, 11 de junio de 2010 22:02
  • :-)
    Hola de nuevo,

    Benjamin, te lo vuelvo a preguntar: ¿Por que demonios intentas juntar 3 cosas diferentes en una sola? ¿Acaso esperas obtener alguna ventaja que compense todos los inconvenientes que esto va a generar?

    Te estás pasando los principios básicos de un buena arquitectura por el forro...

    Dale un vistazo a los principios de arquitectura SOLID:
    http://en.wikipedia.org/wiki/Solid_(object-oriented_design)

    El primero de ellos se basa en el principio de responsabilidad único (justo lo contrario de lo que estas haciendo).

    Saludos,


    No olvides marcar la respuesta como correcta si te ha sido de utilidad :-)

    [MS-MVP-MCTS]

    Mi Perfil MVP en: https://mvp.support.microsoft.com/profile/Lluis
    NUG: http://andorradotnet.com
    Web: http://www.ordeeno.com
    Blog: http://msmvps.com/blogs/lfranco
    Geeks: http://geeks.ms/blogs/lfranco

    lunes, 14 de junio de 2010 7:02
    Moderador
  • Muchas Gracias leandro cierro la consulta ya esta resuelto el tema, al final lo que hice separe todos los procedimientos en diferentes sp insert update y delete. de esta forma:

     CREATE Procedure SFAC_Insertar
    (
     @nFact int,
     @nombEmisor varchar(10),
     @codEmisor int,
     @codComercio int,
     @codCadena int
    )
    as
    begin
     insert into RegistroFacturas ([nFact], [nombEmisor], [codEmisor], [codComercio], [codCadena]) values (@nFact, @nombEmisor, @codEmisor, @codComercio, @codCadena)
    end
    GO

    CREATE procedure SFAC_EliminarDatos
    (
     @nFact int,
     @codEmisor int,
     @nombEmisor varchar(10),
     @codComercio int,
     @codCadena int 
    )
    as
    delete  from RegistroFacturas
     where @nFact = nFact
     and @codEmisor = codEmisor
     and @nombEmisor = nombEmisor
     and @codComercio = codComercio
     and @codCadena = codCadena

    GO

    CREATE procedure SFAC_GuardaRegistros
    (
     @nFact integer,
     @codEmisor integer,
     @nombEmisor varchar(30)
    )
    as
    begin
    select nFact NumeroFactura, codEmisor CodigoEmisor, nombEmisor NombreEmisor,codComercio CodigoComercio, nombComercio NombreComercio  from RegistroFacturas
    end
    GO

    CREATE procedure SFAC_ActualizarDatos
    (
     @nFact int,
     @codEmisor int,
     @nombEmisor varchar(10),
     @codComercio int,
     @codCadena int 

    as
    update RegistroFacturas set @codEmisor = codEmisor, @nombEmisor = nombEmisor, @codComercio = codComercio, @codCadena = codCadena
    where @nFact = nFact
    GO

    Disculpa como se podría hacer un procedimiento almacenado usando BIT? por ejemplo para guardar un usuario e indicar si es administrador o usuario o es lo mismo?

    De antemano gracias...

    domingo, 3 de diciembre de 2017 2:15

Todas las respuestas

  • hola

    lo que debes hacer es determinar que oepracion debes lanzar en cada momento, o se tendras por un lado tu entidfad con un id, si es un alta seguro el id no existira en tu db, por lo tanto si consultas por este te dira que no esta y alli lanzas el procedure de insert

    si tienes un id y lo verificas, la db te dira que existe, por lo tanto lanzaras el procedure de update, las otras oepraciones de select y delete ya son manuales y lanzadas por una accion del usuario o proceso, o sea no necesitas verificar previamente

    te dejo unos link en donde realizo todas estas oepraciones solo que con queries simples, sin stored procedure, lo unico que deberias adaptar es la llamada al mismo que imagijno sabes como hacerlo

    ADO.NET Parte 3 Actualizaci ó n Informaci ó n Sql Server

    ADO.NET - Parte 1 - Recuperar Informaci ó n Sql Server

    [ADO.NET] Parte 5 - Ejemplos Simples Operaciones CRUD

    analzia los ejemplso como estas programadas y estudia la tecnica solo debes cambiar el query por el nombre del SP que has creado, eso es todo, las operacines son asl mismas

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    viernes, 11 de junio de 2010 0:45
  • :-)
    Hola,

    Sin duda puedes hacerlo, pero las buenas normas de diseño recomiendan utilizar distintos SP para cada una de las opciones. De hecho es más claro ver un código que ejecuta un SP 'insertarProducto' o 'actualizarProducto' que siempre el mismo SP con parámetros distintos.

    Particularmente te recomendaría utilizar 3 SP para la actualización y una función de tipo tabla para el SELECT.

    Saludos,


    No olvides marcar la respuesta como correcta si te ha sido de utilidad :-)

    [MS-MVP-MCTS]

    Mi Perfil MVP en: https://mvp.support.microsoft.com/profile/Lluis
    NUG: http://andorradotnet.com
    Web: http://www.ordeeno.com
    Blog: http://msmvps.com/blogs/lfranco
    Geeks: http://geeks.ms/blogs/lfranco

    viernes, 11 de junio de 2010 10:07
    Moderador
  • Amigos miren busque mas info por internet y encontre una pagina super buena donde explican lo que yo necesito, miren este el codigo que llevo hasta el momento, son 3 procedimientos almacenados por separado, ahora me gustaria por favor que me indiquen como los puedo juntar

    ----------------------------------------------------------
    Actualizar Datos

    CREATE procedure SFAC_ActualizarDatos
    (
     @nFact int,
     @codEmisor int,
     @nombEmisor varchar(10),
     @codComercio int,
     @codCadena int 

    as
    update RegistroFacturas set @codEmisor = codEmisor, @nombEmisor = nombEmisor, @codComercio = codComercio, @codCadena = codCadena
    where @nFact = nFact
    GO

    ---------------------------------------------------------
    Eliminar Datos

    CREATE procedure SFAC_EliminarDatos
    (
     @nFact int,
     @codEmisor int,
     @nombEmisor varchar(10),
     @codComercio int,
     @codCadena int 
    )
    as
    delete  from RegistroFacturas
     where @nFact = nFact
     and @codEmisor = codEmisor
     and @nombEmisor = nombEmisor
     and @codComercio = codComercio
     and @codCadena = codCadena

    GO

    ---------------------------------------------------------
    Inserta Datos

    CREATE Procedure SFAC_InsertarDatos
    (
     @nFact int,
     @codEmisor int,
     @nombEmisor varchar(10),
     @codComercio int,
     @codCadena int 
    )

    as
    insert into RegistroFacturas ([nFact], [codEmisor], [nombEmisor], [codComercio], [codCadena]) values (@nFact, @codEmisor, @nombEmisor, @codComercio, @codCadena)
    GO
    ---------------------------------------------------------

    viernes, 11 de junio de 2010 22:02
  • Yo creo que seria una cosa asi, indiquenme si me equivoco por favor

    Create Procedure SFAC_InsertarEliminarModificar
    (
     @nFact int,
     @codEmisor int,
     @nombEmisor varchar(10),
     @codComercio int,
     @codCadena int
    )
    begin
    if (select * from RegistroFacturas where nFact = @nFact)
    begin
     insert into RegistroFacturas ([nFact], [codEmisor], [nombEmisor],
     [codComercio], [codCadena]) values (@nFact, @codEmisor, @nombEmisor,
     @codComercio, @codCadena)
    end
    else
     delete  from RegistroFacturas where @nFact = nFact
     and @codEmisor = codEmisor
     and @nombEmisor = nombEmisor
     and @codComercio = codComercio
     and @codCadena = codCadena
    end if
     insert into RegistroFacturas ([nFact], [codEmisor], [nombEmisor], [codComercio], [codCadena]) values (@nFact, @codEmisor, @nombEmisor, @codComercio, @codCadena)
    end

    viernes, 11 de junio de 2010 22:35
  • :-)
    Hola de nuevo,

    Benjamin, te lo vuelvo a preguntar: ¿Por que demonios intentas juntar 3 cosas diferentes en una sola? ¿Acaso esperas obtener alguna ventaja que compense todos los inconvenientes que esto va a generar?

    Te estás pasando los principios básicos de un buena arquitectura por el forro...

    Dale un vistazo a los principios de arquitectura SOLID:
    http://en.wikipedia.org/wiki/Solid_(object-oriented_design)

    El primero de ellos se basa en el principio de responsabilidad único (justo lo contrario de lo que estas haciendo).

    Saludos,


    No olvides marcar la respuesta como correcta si te ha sido de utilidad :-)

    [MS-MVP-MCTS]

    Mi Perfil MVP en: https://mvp.support.microsoft.com/profile/Lluis
    NUG: http://andorradotnet.com
    Web: http://www.ordeeno.com
    Blog: http://msmvps.com/blogs/lfranco
    Geeks: http://geeks.ms/blogs/lfranco

    lunes, 14 de junio de 2010 7:02
    Moderador
  • Benjamin, no me queda claro que quieres hacer o por que quieres hacer esto, cual es la lógica de implementar toda esta funcionalidad en un solo SP, ya que lo que te Lluis es totalmente cierto.

    Tal vez si nos explicas de manera un poco mas detallada lo que estás intentando hacer te podríamos ayudar mejor.

    Saludos,


    Mauricio Atanache G. - MCP
    Bogotá - Colombia
    "Bienaventurados los Pesimistas. Por que hacen BACKUPS."
    lunes, 14 de junio de 2010 7:54
  • si me quedo claro con su exlpicacion que mejor es por procedimiento separados, entonces miren estoy haciendo ahora todo por separado pero tengo una duda con el insert, como puedo hacer para que cuando ingrese un registro a la tabla ese no se repita, y me inserte el mismo 2 veces, nose sime explico. mire el codigo por favor.

    CREATE Procedure SFAC_Insertar
    (
     @nFact int,
     @codEmisor int,
     @nombEmisor varchar(10),
     @codComercio int,
     @codCadena int
    )
    as
    begin
     insert into RegistroFacturas ([nFact], [codEmisor], [nombEmisor],
     [codComercio], [codCadena]) values (@nFact, @codEmisor, @nombEmisor,
     @codComercio, @codCadena)
    end
    GO

    lunes, 14 de junio de 2010 18:13
  • y como le hago para usar ese procedimiento miren llevo esto: si me encuentran errores les pediria por favor que me ayuden o me indiquen cuales son.

    private void btnGuardar_Click(object sender, EventArgs e)
            {                     
                try
                {
                    using (SqlConnection conn = new SqlConnection(conexion))
                    {
                        conn.Open();
                        SqlCommand cmd = new SqlCommand("SFAC_Insertar", conn);
                        cmd.CommandType = CommandType.StoredProcedure;

                        //Parametros de Entrada
                        SqlParameter nFactura = new SqlParameter("@nFact", SqlDbType.Int);
                        nFactura.Value = List2.SelectedIndex;
                        cmd.Parameters.Add(nFactura);

                        SqlParameter codEmisor = new SqlParameter("@codEmisor", SqlDbType.Int);
                        codEmisor.Value = List1.Text;
                        cmd.Parameters.Add(codEmisor);

                        SqlParameter nombEmisor = new SqlParameter("@nombEmisor", SqlDbType.VarChar);
                        nombEmisor.Value = List1.SelectedValue;
                        cmd.Parameters.Add(nombEmisor);

                        SqlParameter codComercio = new SqlParameter("@codComercio", SqlDbType.Int);
                        codComercio.Value = cbb_Comercio.SelectedValue;
                        cmd.Parameters.Add(codComercio);

                        SqlParameter codCadena = new SqlParameter("@codCadena", SqlDbType.Int);
                        codCadena.Value = cbb_Cadena.SelectedValue;
                        cmd.Parameters.Add(codCadena);

                        //Parametros de salida
                        SqlDataAdapter da = new SqlDataAdapter(cmd);
                        DataTable dt = new DataTable();
                        da.Fill(dt);
                        //List3.Nodes.Add(dt);
                    }
                }
                catch (Exception exp)
                {
                    MessageBox.Show(exp.Message.ToString(), "Error");
                    return;
                }
            }

     

    lunes, 14 de junio de 2010 18:48
  • hola

    ese codig esta correcto, has definido los parametros, establecido el nombre del SP y el tipo StoredProcedure en el command, parece estar todo bien

     

    el unico detalle que le veo que por ahi de algun problema es que no defines el tipo de dato correcto, por ejemplo aqui

    SqlParameter codEmisor = new SqlParameter("@codEmisor", SqlDbType.Int);
    codEmisor.Value = Convert.ToInt32 (List1.Text);
    cmd.Parameters.Add(codEmisor);

    no le defines el Value como entero, le estabas pasando un string, por ahi esto peude afectar al filtro, revisa los otros campos numericos sino tienes que hacer lo mismo

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    lunes, 14 de junio de 2010 21:17
  • Amigos como puedo hacer para que un en parametro de entrada me retorne lo que esta cargado en el treeview, yo lo estaba haciendo asi.

    pero me aparece null osea vacio miren


    SqlParameter codEmisor = new SqlParameter("@codEmisor", SqlDbType.Int);
                        codEmisor.Value = Convert.ToInt32(List1.Text);
                        cmd.Parameters.Add(codEmisor);

    lunes, 14 de junio de 2010 21:32
  • respondi en el otro post

    http://social.msdn.microsoft.com/Forums/es-ES/vcses/thread/8d555d7f-b077-4b43-a759-11ab263ff0f2

     


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    martes, 15 de junio de 2010 4:20
  • Muchas Gracias leandro cierro la consulta ya esta resuelto el tema, al final lo que hice separe todos los procedimientos en diferentes sp insert update y delete. de esta forma:

     CREATE Procedure SFAC_Insertar
    (
     @nFact int,
     @nombEmisor varchar(10),
     @codEmisor int,
     @codComercio int,
     @codCadena int
    )
    as
    begin
     insert into RegistroFacturas ([nFact], [nombEmisor], [codEmisor], [codComercio], [codCadena]) values (@nFact, @nombEmisor, @codEmisor, @codComercio, @codCadena)
    end
    GO

    CREATE procedure SFAC_EliminarDatos
    (
     @nFact int,
     @codEmisor int,
     @nombEmisor varchar(10),
     @codComercio int,
     @codCadena int 
    )
    as
    delete  from RegistroFacturas
     where @nFact = nFact
     and @codEmisor = codEmisor
     and @nombEmisor = nombEmisor
     and @codComercio = codComercio
     and @codCadena = codCadena

    GO

    CREATE procedure SFAC_GuardaRegistros
    (
     @nFact integer,
     @codEmisor integer,
     @nombEmisor varchar(30)
    )
    as
    begin
    select nFact NumeroFactura, codEmisor CodigoEmisor, nombEmisor NombreEmisor,codComercio CodigoComercio, nombComercio NombreComercio  from RegistroFacturas
    end
    GO

    CREATE procedure SFAC_ActualizarDatos
    (
     @nFact int,
     @codEmisor int,
     @nombEmisor varchar(10),
     @codComercio int,
     @codCadena int 

    as
    update RegistroFacturas set @codEmisor = codEmisor, @nombEmisor = nombEmisor, @codComercio = codComercio, @codCadena = codCadena
    where @nFact = nFact
    GO

    • Marcado como respuesta Aprendis24 miércoles, 16 de junio de 2010 16:03
    miércoles, 16 de junio de 2010 16:03
  • Muchas Gracias leandro cierro la consulta ya esta resuelto el tema, al final lo que hice separe todos los procedimientos en diferentes sp insert update y delete. de esta forma:

     CREATE Procedure SFAC_Insertar
    (
     @nFact int,
     @nombEmisor varchar(10),
     @codEmisor int,
     @codComercio int,
     @codCadena int
    )
    as
    begin
     insert into RegistroFacturas ([nFact], [nombEmisor], [codEmisor], [codComercio], [codCadena]) values (@nFact, @nombEmisor, @codEmisor, @codComercio, @codCadena)
    end
    GO

    CREATE procedure SFAC_EliminarDatos
    (
     @nFact int,
     @codEmisor int,
     @nombEmisor varchar(10),
     @codComercio int,
     @codCadena int 
    )
    as
    delete  from RegistroFacturas
     where @nFact = nFact
     and @codEmisor = codEmisor
     and @nombEmisor = nombEmisor
     and @codComercio = codComercio
     and @codCadena = codCadena

    GO

    CREATE procedure SFAC_GuardaRegistros
    (
     @nFact integer,
     @codEmisor integer,
     @nombEmisor varchar(30)
    )
    as
    begin
    select nFact NumeroFactura, codEmisor CodigoEmisor, nombEmisor NombreEmisor,codComercio CodigoComercio, nombComercio NombreComercio  from RegistroFacturas
    end
    GO

    CREATE procedure SFAC_ActualizarDatos
    (
     @nFact int,
     @codEmisor int,
     @nombEmisor varchar(10),
     @codComercio int,
     @codCadena int 

    as
    update RegistroFacturas set @codEmisor = codEmisor, @nombEmisor = nombEmisor, @codComercio = codComercio, @codCadena = codCadena
    where @nFact = nFact
    GO

    Disculpa como se podría hacer un procedimiento almacenado usando BIT? por ejemplo para guardar un usuario e indicar si es administrador o usuario o es lo mismo?

    De antemano gracias...

    domingo, 3 de diciembre de 2017 2:15
  • hola buenas una pregunta queria saber esto lo pondre para explicarme mejor

    delete  from RegistroFacturas 
     where @nFact = nFact
     and @codEmisor = codEmisor
     and @nombEmisor = nombEmisor
     and @codComercio = codComercio
     and @codCadena = codCadena

    GO

    en la parte que dice where 

    @nFact = nFact
     and @codEmisor = codEmisor
     and @nombEmisor = nombEmisor
     and @codComercio = codComercio
     and @codCadena = codCadena

    vienen siendo los nombres de la tabla (RegistroFacturas )? se lo agradeceria que me contestara

    miércoles, 4 de abril de 2018 17:52
  • Los principios SOLID aplican para la clase, en los links que agregaste, las operaciones CRUD se realizan en un mismo formulario y como tal no es una clase pero implementa todos los métodos CRUD para una tabla en un sólo formulario. http://ltuttini.blogspot.com/2010/01/adonet-parte-5-ejemplos-simples.html

    Debe entenderse que para aplicaciones con una lógica automatizada, no es posible crear un formulario para editar registro por registro. Incluso no habría usuario que procese cada operación individualmente.

    Tiene mucho sentido crear un procedimiento que se asegure de la integridad de los datos, que verifique si el registro existe y realice las adecuaciones pertinentes. Tiene más sentido cuando el SP se refiere únicamente a una tabla.

    Además en cierto tipo de soluciones disminuye el tiempo de proceso del lado del cliente si el SP se ejecuta de forma asíncrona.

    Por otra parte, muchas veces no es posible tener una LLave primaria o única, incluso para comprimir la base de datos, textos repetidos podrías indexarlos en una tabla secundaria y automáticamente asignar un foreing key 

    También hay que tomar en cuenta que las bases de datos relacionales están siendo obsoletas en un entorno WEB y la referencia debe ser sustituida por lógica de la aplicación. https://support.office.com/es-es/article/crear-una-base-de-datos-de-access-para-compartir-en-web-cca08e35-8e51-45ce-9269-8942b0deab26#__toc262221108

    en el futuro será muy común tener un web service que se encargue de la integridad de la Base de Datos y

    tendrá mucho sentido tener un SP que encapsule la complejidad de la integridad de los datos y mientras los web service correspondan a un sólo objetivo, cumple los principios SOLID al ser el webservice diseñado para ser responsable sólo de un objetivo, se puede extender el objeto sin modificar su principio, diseñado para una interfaz específica, sustituible, y abstrae la operación CRUD para ser llamado desde aplicaciones que consuman el servicio, 

    en éste foro esperaba encontrar las siguientes explicaciones sin tanta critica:
    1) el método FIND de un recordset tarda mcuho más que el método Filter y a su vez ejecutar el comando SELECT tarda mucho menos...Este comportamiento se ve afectado por la ubicación del Cursos de la conexión

    2) Otro Método podría ser asignando el resultado de una consulta para comprobar si existe 

    SELECT id INTO is_uid FROM stadistics WHERE id = uid LIMIT1

    Éste método varia porque en SQL Server se usa TOP, etc, https://www.w3schools.com/sql/sql_top.asp

    3) Si la tabla tiene una clave primaria puedes usar 

    INSERT INTO stadistics (id, stats) VALUES (uid, 1)
    ON DUPLICATE KEY UPDATE stats = stats +1;

    4)y puedes usar un truco con un string y usar un while para insertar varios registros en una única llamada al SP.... ¿han realizado ciclos en infopath, dónde teóricamente no existe una sentencia para ciclo? 

    WHILE LENGTH(tags)>0 DO

     http://otroblogmas.com/procedure-de-estadisticas-que-haga-un-insert-o-un-update-ii/

    Bueno al final, ni soy experto ni está claro el alcance de ésta necesidad, Microsoft mismo ha documentado una forma de simular todo lo anterior, y se entiende que no lo recomienda, pero está claro que es una necesidad y se requiere que un experto documente los costos de implementar ésta técnica y definir cual de todas las técnicas es la mejor. y en el caso de los cursores, si es del lado del cliente o del lado del servidor, está claro que tendrá un impacto en ambos sentidos. por lo que es imprescindible que del lado del servidor existiera una forma de disminuir las cargas agrupando las peticiones en una única tarea indicando que será una característica asíncrona y que el servidor las ejecutará según un sistema predictivo que disminuya el impacto. También está claro que eso desearíamos poder lograrlo con un simple store procedure 

    https://docs.microsoft.com/en-us/sql/relational-databases/in-memory-oltp/simulating-an-if-while-exists-statement-in-a-natively-compiled-module?view=sql-server-2017

    https://codeday.me/es/qa/20190321/344428.html

    IF EXISTS (SELECT * FROM Clock WHERE clockDate = GETDATE() AND userName = @userName)
            BEGIN
                UPDATE Clock SET breakOut = GETDATE() WHERE clockDate = GETDATE() AND userName = @userName
            END
        ELSE
            BEGIN
                INSERT INTO Clock (clockDate, userName, breakOut) VALUES (GETDATE(), @userName, GETDATE())
            END

     A todos los que lean éste post intenté integrar varias técnicas y sus fuentes, la descripción del objetivo que se desea alcanzar es una opinion personal, pero en los links verán una descripción de un objetivo más definido. 

    Por el momento sigo realizando mediciones para afinar un método que minimice el tiempo de ejecución de las inserciones y validaciones. 

    20 minutos para insertar 3mil registros a través de una VPN no es óptimo. Otras técnicas que estoy validando es insertar en una tabla temporal y con una vista realizar la inserción de los nuevos registros y con un loop realizar los updates necesarios...

    También se aclara que usar un INSERT en un comando de texto no es optimo porque no admite caracteres especiales. el mejor método para hacerlo es a través de un objeto ADO que maneje cada FIELD... He visto como muchos Ingenieros crean interfaces con sistemas como SAP y la inserción de datos falla porque todo lo diseñaron con archivos de texto...con las nuevas tecnologías sería mejor usar un spreadsheet o un archivo mdb o accdb 

    De las normas de diseño!!!https://docs.microsoft.com/en-us/sql/relational-databases/in-memory-oltp/simulating-an-if-while-exists-statement-in-a-natively-compiled-module?view=sql-server-2017

    Microsoft ha dejado el truco, sin indicar riesgos, o mejores prácticas, sin alentar ni desalentar, la experiencia nos habla de los costos de proceso, pero la necesidad es evidente con la existencia de éste simple artículo.

    DECLARE @exists BIT = 0 SELECT TOP 1 @exists = 1 FROM MyTable WHERE ... IF @exists = 1

    lunes, 26 de agosto de 2019 1:56