Ver Mensaje Individual
  #1 (permalink)  
Antiguo 21/12/2011, 07:04
Pelydas
 
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.