Microsoft quito el soporte de cursores en triggesr??

07/08/2006 - 15:35 por Rodrigo Bedoya | Informe spam
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

#1 Maxi
07/08/2006 - 16:50 | Informe spam
Hola, cuantas veces vas a postear esto mismo? microsoft no saco el soporte
de cursores ni mucho menos, yo ya te respondi en anteriores oportunidades,
vos estas declarando el cursor dentro de SQL Dinamico con EXEC y luego
queres usar esa variable afuera, el problema esta ahi no en los cursores ni
en los triggers. O bien repensas el trigger para que no use ni cursores ni
sql dinamico o sino proba usandp sp_executesql en lugar de exec


Salu2
Maxi [MVP SQL SERVER]
www.sqlgurus.org
Speaker INETA
Speaker Culminis


"Rodrigo Bedoya" escribió en el mensaje
news:
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






Preguntas similares