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

Como evitar el uso de un cursor

Estas en el tema de Como evitar el uso de un cursor en el foro de SQL Server en Foros del Web. Hola a todos, tengo el siguiente codigo en SQLS2008R2 que es un ejemplo de algo mas complejo: USE bbdd GO IF EXISTS (SELECT table_name FROM ...
  #1 (permalink)  
Antiguo 21/12/2011, 07:04
 
Fecha de Ingreso: abril-2010
Mensajes: 68
Antigüedad: 14 años
Puntos: 0
Como evitar el uso de un cursor

Hola a todos, tengo el siguiente codigo en SQLS2008R2 que es un ejemplo de algo mas complejo:

USE bbdd
GO
IF EXISTS (SELECT table_name FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME='a_prueba')
DROP TABLE a_prueba
CREATE TABLE a_prueba(
[id] [int] IDENTITY(1,1) NOT NULL,
[codigo] [int] NOT NULL,
[texto] [char](10) NOT NULL)
GO
INSERT INTO a_prueba (codigo,texto)
VALUES (1,'TEXTO 1'),(1,'TEXTO 2'),(2,'TEXTO 2'),(2,'TEXTO 1'), (1,'TEXTO 3'),(2,'TEXTO 3')
CREATE TRIGGER [dbo].[a_prueba_bd]
ON [dbo].[a_prueba]
INSTEAD OF DELETE
AS
BEGIN
SET NOCOUNT ON;
DECLARE @pCodigo INT
DECLARE @pTexto CHAR(20)
DECLARE aa CURSOR FOR SELECT codigo,texto FROM deleted
OPEN aa
FETCH NEXT FROM aa INTO @pCodigo,@pTexto
WHILE @@FETCH_STATUS = 0
BEGIN
IF @pCodigo <> 1
DELETE a_prueba WHERE codigo=@pCodigo AND texto=@pTexto
ELSE
DELETE a_prueba WHERE texto=@pTexto
FETCH NEXT FROM aa INTO @pCodigo,@pTexto
END
END
GO

con esto logro que si:
DELETE a_prueba WHERE texto='TEXTO 2' AND codigo=1 me borra todas las lineas que tienen 'TEXTO 2', si por el contrario DELETE a_prueba WHERE texto='TEXTO 2' AND codigo=2 entonces solo me borra las que cumplan con 'TEXTO 2' AND codigo=2.
Lo que quiero es evitar el cursor y usar una CTE pero no tengo idea, Gracias.
  #2 (permalink)  
Antiguo 21/12/2011, 09:14
 
Fecha de Ingreso: abril-2010
Mensajes: 68
Antigüedad: 14 años
Puntos: 0
Respuesta: Como evitar el uso de un cursor

Para que sea mas comprensible mi pregunta, si 'TEXTO 1' AND codigo=1 borro todos los 'TEXTO 1' con todos los codigos, si uso codigo=2 o codigo= 3....., codigo=x solo debe borrar cuando texto = 'TEXTO 1' and codigo=x
  #3 (permalink)  
Antiguo 21/12/2011, 14:02
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 4 meses
Puntos: 38
Respuesta: Como evitar el uso de un cursor

Código:
alter TRIGGER [dbo].[a_prueba_bd]
ON [dbo].[a_prueba]
INSTEAD OF DELETE
AS
BEGIN
	SET NOCOUNT ON;
	
	DELETE P
	FROM   a_prueba P
	INNER JOIN 
		   deleted d
	ON     (
	         d.codigo     <> 1 
	         AND P.codigo = d.codigo
			 AND P.texto = d.texto
		    )
		    OR
		    (
				d.codigo = 1
				AND P.texto = d.texto
		   )
END
GO
Saludos!
__________________
La sencillez y naturalidad son el supremo y último fin de la cultura...
--
MCTS : SQL Server 2008, .NET Framework 3.5, ASP.NET Applications.
  #4 (permalink)  
Antiguo 22/12/2011, 02:18
 
Fecha de Ingreso: abril-2010
Mensajes: 68
Antigüedad: 14 años
Puntos: 0
Respuesta: Como evitar el uso de un cursor

Muchas gracias Andres, funciona a la perfeccion, salu2.

Etiquetas: cursor, select, sql
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 06:05.