Tengo Una aplicacion bastante robusta y estable en sql2000, pero algunos
clientes pequeños van a tener sql2005 express , mi pregunta es microsoft
quito el soporte de cursores en triggers cuando se ejecutan dinamicamente en
cadenas ?? .. Anexo este ejemplo sencillo pero completo donde se crea un
cursor en un trigger
/*
En este paquete se crean las tablas cabecera2006 y detalle2006
El trigger asociado a la tabla de detalle
Se graba un registro en cabecera y otro en detalle para visualizar el
el error en sql2005 , pero este mismo paquete se corre en sql2000 bien.
*/
GO
- Archivo Detalle --
CREATE TABLE DETALLE2006(
[cDocumento] [char](2) DEFAULT (' '),
[cNumero] [char](8) DEFAULT (' '),
[dFecha] [datetime] DEFAULT (' '),
[cTERCERO] [char](11) DEFAULT (' '),
[ccuenta] [char](20) DEFAULT (' '),
[nValor] numeric(10,2) DEFAULT (0),
[nItem] int DEFAULT (0),
CONSTRAINT [DETALLE2006_] PRIMARY KEY NONCLUSTERED
(
[cDOCUMENTO] ASC,
[cNumero] ASC,
[nItem] ASC
)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO
DROP TABLE CABECERA2006
GO
-Archivo Cabecera
CREATE TABLE CABECERA2006(
[cDocumento] [char](2) DEFAULT (' '),
[cNumero] [char](8) DEFAULT (' '),
[dFecha] [datetime] DEFAULT (' '),
[cTransaccion] [char] (10) DEFAULT (' '),
CONSTRAINT [CABECERA2006_] PRIMARY KEY NONCLUSTERED
(
[cDOCUMENTO] ASC,
[cNumero] ASC
)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO
Trigger Tabla Detalle
set ANSI_NULLS ON
set QUOTED_IDENTIFIER OFF
GO
CREATE TRIGGER [dbo].[grabacion] ON [dbo].[DETALLE2006]
FOR INSERT
AS
DECLARE @Cdocumento CHAR(2),
@cNumero CHAR(8),
@dFecha DATETIME,
@cExpresion VARCHAR(200),
@cTransaccion CHAR(10),
@cAno CHAR(4)
SELECT @cDocumento = ins.cDocumento,@cNumero = ins.cNumero,@dFecha =
ins.dFecha FROM INSERTED INS
SET @Cano = LTRIM(RTRIM(STR(YEAR(@dFecha))))
Dependiendo de la fecha se carga la tabla respectiva pueder ser
cabecera2005, cabecera2006 etc, por eso se hace en forma dinamica
SET @cExpresion="DECLARE cabecera CURSOR FOR SELECT cTransaccion FROM
cabecera"+@Cano+
" WHERE cDocumento='"+@cDOCUMENTO+"' AND cNumero='"+@cNumero+"'"
EXECUTE(@cExpresion)
Solo es un ejemplo para traer datos de la cabecera y aplicar
algun logica en el trigger
OPEN cabecera
FETCH NEXT FROM cabecera INTO @cTransaccion
CLOSE cabecera
DEALLOCATE cabecera
RETURN
Insertamos Registro Cabecera -
INSERT INTO CABECERA2006 VALUES('RC','9898','05/08/2006','COMPRAS')
GO
/*
Insertamos Registro Detalle
Aqui se ejecuta el trigger de insertar de la tabla detalle2006
y se genera error ,pero en sql2000 no genera error
*/
INSERT INTO DETALLE2006
VALUES('RC','9898','05/08/2006','7528558','1305050',1500000,1);
Todo Esto Funciona super bien en sql2000
Saludos
RODRIGO
Leer las respuestas