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

[SOLUCIONADO] Procedimiento con Deletes anidados

Estas en el tema de Procedimiento con Deletes anidados en el foro de SQL Server en Foros del Web. Buenas, Creo que el título es bastante claro, tengo varias tablas que comparten un ID y quiero hacer un procedimiento que borre todos los registros ...
  #1 (permalink)  
Antiguo 23/12/2014, 08:20
 
Fecha de Ingreso: diciembre-2014
Mensajes: 111
Antigüedad: 9 años, 11 meses
Puntos: 9
Procedimiento con Deletes anidados

Buenas,

Creo que el título es bastante claro, tengo varias tablas que comparten un ID y quiero hacer un procedimiento que borre todos los registros de todas las tablas donde dicho ID sea igual al parámetro que yo le pase. Algo del tipo:
Código SQL:
Ver original
  1. CREATE PROC SuperDelete(
  2. @ID INT
  3. )
  4. AS DELETE FROM t1 WHERE ID=@ID

Pero borrando varias tablas de una tacada.

La verdad es que no se muy bien por donde atacarle, ¿ideas?

Última edición por gnzsoloyo; 23/12/2014 a las 08:25 Razón: Usar Highlight "SQL", por favor,.
  #2 (permalink)  
Antiguo 23/12/2014, 08:47
 
Fecha de Ingreso: diciembre-2014
Mensajes: 111
Antigüedad: 9 años, 11 meses
Puntos: 9
Respuesta: Procedimiento con Deletes anidados

Vaaaaaale, acabo de conocer el fantástico mundo del "on delete cascade" lo malo es que las tablas ya las tengo creadas, ¿alguien puede decirme como hago para hacer el alter table y aplicarles esa opción?

PD: Una de las tablas es "nieta" y actualmente usa una foreign key con dos atributos de una de las hijas.

Para aclarar:

Tabla T1 (ID, DatoT1_1, ..., DatoT1_N)
Tabla T2 (ID, DatoT2_1, ..., DatoT2_N)
Tabla T3 (ID, ID2, DatoT3_1, ..., DatoT3_N)
Tabla T4 (ID, ID2, DatoT4_1, ..., DatoT4_N)
  #3 (permalink)  
Antiguo 23/12/2014, 08:47
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 3 meses
Puntos: 774
Respuesta: Procedimiento con Deletes anidados

Código SQL:
Ver original
  1. CREATE PROC SuperDelete(
  2. @ID INT
  3. )
  4. AS
  5. DELETE FROM t1 WHERE ID=@ID
  6. DELETE FROM t2 WHERE id=@id
  7. DELETE FROM t3 WHERE id=@id

eso no te funciona????

Para el delete on cascade, lo unico que tienes que hacer es dropear tus FK y volverlas a crear usando en "delete on cascade" y listo, lo otro que podrias hacer es primero eliminar en cascada esto que es, que primero borres los datos de las tablas nietas, luego de las hijas y al ultimo de las padres :) sencillo
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #4 (permalink)  
Antiguo 23/12/2014, 08:51
 
Fecha de Ingreso: diciembre-2014
Mensajes: 111
Antigüedad: 9 años, 11 meses
Puntos: 9
Respuesta: Procedimiento con Deletes anidados

Siempre es la respuesta más simple... He intentado meterle JOIN, AND, varios AS... y era sin meterle nada, bravo yo... XD

¡Muchas gracias!
  #5 (permalink)  
Antiguo 23/12/2014, 08:53
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 3 meses
Puntos: 774
Respuesta: Procedimiento con Deletes anidados

deletes con JOIN???? eso no se puede, cuando haces un delete en cascada es tabla por tabla no puedes anidar varias instrucciones DML en una sola sentencia, no te deja hacer eso debido a las propiedades ACID de la base de datos ;)
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #6 (permalink)  
Antiguo 23/12/2014, 09:10
 
Fecha de Ingreso: octubre-2014
Ubicación: Buenos Aires
Mensajes: 278
Antigüedad: 10 años, 1 mes
Puntos: 12
Respuesta: Procedimiento con Deletes anidados

Hola Sarlit, podrías hacer un for que recorra las tablas que necesitas y que vaya borrando según el parámetro ingresado.

Código SQL:
Ver original
  1. DECLARE @SQLString NVARCHAR( 4000), @Archivos VARCHAR (150)
  2.  
  3. DECLARE cur_archivos cursor FOR
  4. // tablas que necesitas borrar.
  5.  
  6. OPEN cur_archivos
  7.         FETCH NEXT FROM cur_archivos INTO @tabla
  8. WHILE @@FETCH_STATUS =0
  9. BEGIN
  10.  
  11. SET @SQLString =N' SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED '
  12. SET @SQLString =@SQLString +'delete from'+@tabla+ '''' + ' where  id= '+@id+
  13. SET @SQLString =@SQLString +'SET TRANSACTION ISOLATION LEVEL READ COMMITTED '
  14.  
  15. EXEC sp_executesql @SQLString
  16.  
  17.         FETCH NEXT FROM cur_archivos INTO @tabla
  18. END
  19. CLOSE cur_archivos
  20. DEALLOCATE cur_archivos

Espero te sirva.

Saludos.
__________________
http://www.sp-vision.net
  #7 (permalink)  
Antiguo 23/12/2014, 09:13
 
Fecha de Ingreso: diciembre-2014
Mensajes: 111
Antigüedad: 9 años, 11 meses
Puntos: 9
Respuesta: Procedimiento con Deletes anidados

La desesperación y el desconocimiento, que me llevan por malos caminos.

Por cierto, al ejecutar el delete me da un error, según creo, por en una de las tablas no tener ninguna fila creada con ese ID, ¿Como soluciono eso?

Cod.Error:

Mens 547, Nivel 16, Estado 0, Procedimiento P_OfcContratosFormacionANDExt_DeleteByIDContratoFo rmacion, Línea 4
Instrucción DELETE en conflicto con la restricción REFERENCE "FK__OfcContra__IDCon__58E7D564". El conflicto ha aparecido en la base de datos "bdCurso", tabla "dbo.OfcContratosFormacion_DatosCtto_Mes", column 'IDContratoFormacion'.
Se terminó la instrucción.

(3 filas afectadas)

(12 filas afectadas)

(0 filas afectadas)

(1 filas afectadas)
  #8 (permalink)  
Antiguo 23/12/2014, 09:13
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 3 meses
Puntos: 774
Respuesta: Procedimiento con Deletes anidados

no el error no es porque no haya datos, sino que una columna que quieres eliminar tiene relacion con otra tabla en este caso dbo.OfcContratosFormacion_DatosCtto_Mes, primero elimina la informacion de esta tabla y despues eliminas la de la tabla que te mando el error.....
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #9 (permalink)  
Antiguo 23/12/2014, 09:19
 
Fecha de Ingreso: diciembre-2014
Mensajes: 111
Antigüedad: 9 años, 11 meses
Puntos: 9
Respuesta: Procedimiento con Deletes anidados

Ahhhh, estoy un poco empanadilla, pero ahora sí que sí. ¡Muchísimas gracias!

Etiquetas: delete, procedimiento
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 09:31.