Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

Insertar registros en bloque o lotes en distintas tablas con procedimientos almacenad

Estas en el tema de Insertar registros en bloque o lotes en distintas tablas con procedimientos almacenad en el foro de SQL Server en Foros del Web. Cordial Saludo. La verdad es que no se si la pregunta que voy a hacer es sencilla o complicada, he navegado por muchos foros buscando ...
  #1 (permalink)  
Antiguo 17/11/2012, 23:43
 
Fecha de Ingreso: noviembre-2012
Mensajes: 2
Antigüedad: 11 años, 5 meses
Puntos: 0
Insertar registros en bloque o lotes en distintas tablas con procedimientos almacenad

Cordial Saludo.

La verdad es que no se si la pregunta que voy a hacer es sencilla o complicada, he navegado por muchos foros buscando información acerca de mi caso y la verdad es que parece que a nadie en este mundo se le ha presentado mi situación porque todos dan respuestas de como usar procedimientos almacenados pero insertando un solo registro a la vez y yo necesito una inserción en bloque o en lote en distintas tablas
Estoy haciendo una aplicación visual basic.net, la aplicación se conecta a una base de datos de sql server 2008 r2 y necesito insertar varios registros a distintas tablas a través de procedimientos almacenados pero controlados por transacciones. les explico mas a fondo.
Tengo una tabla de clientes, una tabla ventas, una tabla productos vendidos

la relación de las tablas es la siguiente

clientes --- ventas (a través del campo IdCliente)

ventas --- productos vendidos(a través del campo IdVenta)

el problema consiste en que si un cliente NUEVO realiza una compra de 250 distintos productos entonces la lógica debería ser así

1. Inserto el registro del nuevo cliente en la tabla clientes

2.Inserto el registro de la compra en la tabla ventas

3. inserto los 250 distintos productos que el cliente compro en la tabla productos vendidos

tengo un datatable en memoria con los 250 distintos productos comprados por el cliente, listos para ser guaradados en la tabla productos vendidos

antes tenia una función que me ejecutaba un arraylist lleno de instrucciones sql y lo controlaba con transacciones, es decir hacia algo parecido a esto

Dim Sentencias as new arraylist

sentencias.add (insert into clientes (campos .....) values (valores...)

sentencias.add (insert into ventas (campos .....) values (valores...)

for i = 0 to datatable.rows.count -1

sentencias.add (insert into productosvendidos (campos ...) values (datatable.rows(i).item("campo"), .....)

next

después que tenia el arraylist lleno, llamaba a una funcion ejecutar que recorria todo el arraylist que le pasaba por valor y ejecutaba cada linea de sentencia sql y las controlaba con una transaccion, o se ejecutaban todas o ninguna.

if ejecutar(sentencias) then

mensaje (Todo correcto)

end if

Pero ahora con procedimientos almacenados no se como, tengo los siguientes procedimientos almacenados

insertarcliente

insertarventa

insertarproductosvendidos

pero como llamo a estos tres procedimientos almacenados y que se ejecuten en bloques y que sean controlados por una transacción desde visual basic, sobre todo cuando inserto los 250 productos en la tabla de productos vendidos, si llega a fallar algo, se deben deshacer todos los registros que hayan sido agregados a las distintas tablas, y no puedo colocar una transacción dentro de los procedimientos almacenados ya que cada vez que los llame van a confirmar la transacción, y si llegar a ocurrir un fallo van a quedar los registros incompletos en las tablas y eso NO DEBE SER ASI. la transacción solo se debe confirmar cuando las 252 lineas de sentencias sql estén ejecutadas y sin errores

Por favor les pido que me ayuden, la verdad no se que hacer

Gracias
  #2 (permalink)  
Antiguo 18/11/2012, 00:35
 
Fecha de Ingreso: julio-2012
Ubicación: Israel
Mensajes: 360
Antigüedad: 11 años, 9 meses
Puntos: 40
Respuesta: Insertar registros en bloque o lotes en distintas tablas con procedimiento

Lamentablemente no trabajo con dot net, y no se como todo esta ejecutado atrevés de este entorno. Lo único que puedo contribuir es de como las cosas deben ser en el SQL Server.

La ejecución debe ser máa o menos así:
Código SQL:
Ver original
  1. BEGIN Try
  2. BEGIN TRANSACTION;
  3. EXEC insertarcliente;
  4. EXEC insertarventa;
  5. EXEC insertarproductosvendidos;
  6. Commit;
  7. END Try
  8.  
  9. BEGIN Catch
  10. ROLLBACK;
  11. END Catch
Es decir- ejecutar los tres procedimientos en una transacción.

La inserción de los 250 registros- mejor que la hagas en una instrucción y no en 250:
Código SQL:
Ver original
  1. INSERT INTO clientes (campos .....)
  2. VALUES (..,..,..),(..,..,..),(..,..,..),(..,..,..),...,(..,..,..);
Otra opción:
Código SQL:
Ver original
  1. INSERT INTO clientes (campos .....)
  2. SELECT ..,..,.. UNION ALL
  3. SELECT ..,..,.. UNION ALL
  4. ..
  5. ..
  6. SELECT ..,..,.. ;
__________________
El Castellano no es mi lengua materna: discúlpenme por los errores gramaticales.
Mi blog
  #3 (permalink)  
Antiguo 18/11/2012, 12:19
 
Fecha de Ingreso: noviembre-2012
Mensajes: 2
Antigüedad: 11 años, 5 meses
Puntos: 0
Respuesta: Insertar registros en bloque o lotes en distintas tablas con procedimiento

Gracias por responder GeriReshef

Pero los códigos que me dices no se aplican, ya que si coloco la transacción dentro de los procedimientos almacenados, se confirmarían cada vez que inserte el registro y recuerda que es una inserción de mas de 200 registros al tiempo en distintas tablas.

El otro punto que me dices, es que yo no quiero hacer consulta, sino inserción en bloques

insert into productosvendidos (campos) values (valores)
insert into productosvendidos (campos) values (valores)
insert into productosvendidos (campos) values (valores)
insert into productosvendidos (campos) values (valores)
insert into productosvendidos (campos) values (valores)

y asi sucesivamente, pero esto se debe hacer en un bucle o ciclo que arme la sentencia insert into a medida que va avanzando y ejecutándose pero controlado por transacciones.

Pero de todas maneras muchas gracias por tomarte el tiempo de responder

Cordial Saludo
  #4 (permalink)  
Antiguo 20/11/2012, 10:48
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: Insertar registros en bloque o lotes en distintas tablas con procedimiento

Si vas a insertar muchos registros desde tu clientes, ocupa el tipo de dato TABLE.
__________________
MCTS Isaias Islas
  #5 (permalink)  
Antiguo 20/11/2012, 11:35
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Insertar registros en bloque o lotes en distintas tablas con procedimiento

y has buscado algo sobre triggers??
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me

Etiquetas: distintas, registro, registros, server, sql, tabla, visual, bloques, campos
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 02:14.