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

delete sobre 2 tablas al mismo tiempo

Estas en el tema de delete sobre 2 tablas al mismo tiempo en el foro de SQL Server en Foros del Web. Hola amigos del foro tengo una pregunta haber si me pueden ayudar trabajo con SQL SERVER 2000 y quiero hacer un delete sobre dos tablas ...
  #1 (permalink)  
Antiguo 27/04/2006, 17:00
Avatar de hvaldez  
Fecha de Ingreso: abril-2006
Ubicación: Xalapa Veracruz
Mensajes: 15
Antigüedad: 18 años
Puntos: 0
Exclamación delete sobre 2 tablas al mismo tiempo

Hola amigos del foro tengo una pregunta haber si me pueden ayudar trabajo con SQL SERVER 2000 y quiero hacer un delete sobre dos tablas al mismo tiempo, no se si se pueda hacer algo asi como un inner join sobre un delete.
Tengo dos tablas con los campos siguientes:

tabla: detalle_pedidos_volumen
campos:cod_articulo,des_larga,codprov_sugerido,etc ...

tabla: detalle_pedidos
campos:cod_articulo,pventa,folio,etc...

la tabla detalle_pedidos_volumen contiene informacion de articulos con su respectivo proveedor por ejemplo el cod_articulo 222222 su proveedor es N0045 y la tabla detalle_pedidos solo contiene informacion de articulos como un folio 565 precio 56.5,cod_articulo 222222, etc q se relaciona con la otra tabla mediante el cod_articulo.

ahora lo q quiero hacer es un delete sobre la tabla detalle_pedidos_volumen especificando el codigo del proveedor por ejemplo el N0045 q se encuentra en la tabla detalle_pedidos_volumen en el campo codprov_sugerido y su vez q borre de la tabla detalle_pedidos todos los articulos q pertenecen a ese proveedor con la excepcion de q en la tabla detalle_pedidos no existe el codigo del proveedor.

Para ser mas claros les pongo una informacion y esto es lo que se debe borrar en ambas tablas al mismo tiempo sobre un delete:

detalle_pedidos_volumen
folio cod_articulo des_larga uni_empaque ult_costo codprov_sugerido
453 200081 bata 1 10.4 N0045

detalle_pedidos
folio cod_articulo cod_depto can_pedida can_recibida
24306 200081 8 100 0
24309 200081 8 50 0
24313 200081 8 25 0

eso es lo q debe borrar solo especificando el codigo del proveedor por ejemplo el N0045
Gracias de antemano y espero me puedan ayudar a resolver esto.
  #2 (permalink)  
Antiguo 28/04/2006, 14:39
Avatar de Mithrandir
Colaborador
 
Fecha de Ingreso: abril-2003
Mensajes: 12.106
Antigüedad: 21 años
Puntos: 25
Si una tabla es llave primaria y al otra tiene una llave foránea hacia la anterior entonces puedes simplemente modificar la relación de la llave foránea para activar el ON DELETE CASCADE para que al borrar un registro de la tabla primaria se borre automáticamente todo lo relacionado en la tabla secundaria.

Alternativamente lo puedes hacer manualmente, pero implica que borres a través de un stored procedure y dentro de una transacción metas las dos instrucciones de borrado.
__________________
"El hombre, en su orgullo, creó a Dios a su imagen y semejanza."
Friedrich Nietzsche
  #3 (permalink)  
Antiguo 28/04/2006, 16:24
Avatar de hvaldez  
Fecha de Ingreso: abril-2006
Ubicación: Xalapa Veracruz
Mensajes: 15
Antigüedad: 18 años
Puntos: 0
Gracias Mithrandir pero las tablas no estan relacionadas mediante llave primaria y llave foranea, me podrias ayudar o decir mas o menos como seria el store procedure es q ya le estuve buscando pero la verdad no se como te lo agradeceria muchisimo si me puedieras ayudar con esto.
Gracias de antemano por la ayuda
Saludos
  #4 (permalink)  
Antiguo 28/04/2006, 18:52
Avatar de RootK
Moderador
 
Fecha de Ingreso: febrero-2002
Ubicación: México D.F
Mensajes: 8.004
Antigüedad: 22 años, 2 meses
Puntos: 50
Es coas de jugar un poco con el T/SQL y algo de transacciones... te podría quedar de ésta forma:

Código:
DECLARE @intError INT

BEGIN TRAN --Levantamos una transaccion
        DELETE FROM TABLA1
	SELECT @intError = @@ERROR
	IF (@intError <> 0) GOTO SOLVE
        DELETE FROM TABLA2
	SELECT @intError = @@ERROR
	IF (@intError <> 0) GOTO SOLVE
COMMIT TRAN --si no hubo errores se ejecuta todo

SOLVE:
IF (@intError <> 0) BEGIN
    ROLLBACK TRAN --dehacemos cambios si hubo algun error
END
Salu2
__________________
Nadie roba nada ya que en la vida todo se paga . . .

Exentrit - Soluciones SharePoint & Net
  #5 (permalink)  
Antiguo 03/05/2006, 09:18
Avatar de hvaldez  
Fecha de Ingreso: abril-2006
Ubicación: Xalapa Veracruz
Mensajes: 15
Antigüedad: 18 años
Puntos: 0
Muchas Gracias Rootk me fue de mucha ayuda si lo pude realizar con el codigo q escribiste, pongo la sentencia completa tal cual quedo para q lo cheques:
DECLARE @intError INT

BEGIN TRAN
DELETE FROM detalle_de_pedidos where cod_articulo in (select cod_articulo from detalle_pedidos_volumen where codprov_sugerido='N0048')
SELECT @intError = @@ERROR
IF (@intError <> 0) GOTO SOLVE
DELETE FROM detalle_pedidos_volumen where detalle_pedidos_volumen.codprov_sugerido='N0048'
SELECT @intError = @@ERROR
IF (@intError <> 0) GOTO SOLVE
COMMIT TRAN

SOLVE:
IF (@intError <> 0) BEGIN
ROLLBACK TRAN --dehacemos cambios si hubo algun error
END

Asi es como quedo el codigo final y gracias por la ayuda de nuevo.
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 01:05.