SQL Server - Procedimiento Almacenado, AYUDA!!!!!

 
Vista:

Procedimiento Almacenado, AYUDA!!!!!

Publicado por Christian D. (3 intervenciones) el 18/05/2005 16:08:25
Hola, necesito validar de alguna forma la longitud de un campo que se ingresa a la base de datos, por código de la aplicación no puedo, ya que no la hice yo y no dispongo del código fuente para realizar la modificación. La aplicación cuando inserta los registros en la base de datos llama a un procedimiento almacenado:

CREATE PROCEDURE [spInsertaxx]
(@xx_1 [varchar](50),
@xx_2 [varchar](50),
@xx_3 [datetime],
@xx_4 [datetime],
@xx_5 [datetime],
@xx_6 [varchar](50),
@xx_7 [varchar](50),
@xx_8 [varchar](255),
@xx_9 [varchar](1000),
@xx_10 [varchar](50),
@xx_11 [varchar](50),
@Observaciones_12 [varchar](1000))
AS INSERT INTO [Agentes].[dbo].[tablaxx]
( [xx1],
[xx2],
[xx3],
[xx4],
[xx5],
[xx6],
[xx7],
[xx8],
[xx9],
[xx10],
[xx11],
[Observaciones])
VALUES
( @xx_1,
@xx_2,
@xx_3,
@xx_4,
@xx_5,
@xx_6,
@xx_7,
@xx_8,
@xx_9,
@xx_10,
@xx_11,
@Observaciones_12)
GO

Modifiqué el procedimiento almacenado, pero no me dio resultado:

ALTER PROCEDURE [spInsertaxx]
(@xx_1 [varchar](50),
@xx_2 [varchar](50),
@xx_3 [datetime],
@xx_4 [datetime],
@xx_5 [datetime],
@xx_6 [varchar](50),
@xx_7 [varchar](50),
@xx_8 [varchar](255),
@xx_9 [varchar](1000),
@xx_10 [varchar](50),
@xx_11 [varchar](50),
@Observaciones_12 [varchar](1000))
AS

SET NOCOUNT ON
IF LEN(@Observaciones_12) > 1000
return(0)
--Esta modificación valida que el largo del campo observaciones no sea mayor a 1000 caracteres

INSERT INTO [Agentes].[dbo].[tablaxx]
( [xx1],
[xx2],
[xx3],
[xx4],
[xx5],
[xx6],
[xx7],
[xx8],
[xx9],
[xx10],
[xx11],
[Observaciones])
VALUES
( @xx_1,
@xx_2,
@xx_3,
@xx_4,
@xx_5,
@xx_6,
@xx_7,
@xx_8,
@xx_9,
@xx_10,
@xx_11,
@Observaciones_12)
GO

El problema es que la longitud del campo “observaciones” en la tabla está definido como varchar(1000) y los usuarios de la aplicación descubrieron que ingresando una cantidad de caracteres mayor a 1000 la aplicación se cae.

Por favor necesito ayuda con esto, de que otra forma puedo validar por medio de la base de datos que la longitud del campo “observaciones” no sea mayo a mil caracteres???

Gracias.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Procedimiento Almacenado, AYUDA!!!!!

Publicado por marcelo (16 intervenciones) el 19/05/2005 13:47:38
Hola:
La validación creo que está bien...yo le agregaría:
a) Que en vez de return 0 (que normalmente significa que todo está ok), devuelva un número de error.
b) Adicionalmente haría un RAISERROR para que a la aplicación cliente, le mande un error.
c) Esta validación se realiza solo si la inserción se realiza a través del SP, pero si la aplicación dispara directamente el insert, esta validación no se realiza. En este caso, crearía un trigger de insert, con esta validación... En los ejemplos hay bastante sobre "create trigger".
Con un trigger te asegurás que esta validación se relice siempre..
Un abrazo...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Procedimiento Almacenado, AYUDA!!!!!

Publicado por Christian D. (3 intervenciones) el 19/05/2005 16:00:00
Gracias Marcelo, voy a probar lo que me dices.
Hace unos días lo primero que hice para realizar la validación fue crear un Trigger:

IF EXISTS (SELECT name FROM sysobjects
WHERE name = 'muylargo' AND type = 'TR')
DROP TRIGGER muylargo
GO

CREATE TRIGGER muylargo ON discadomanual INSTEAD OF INSERT
AS

SET ANSI_WARNINGS OFF
DECLARE @rc AS INT
SET @rc = (select len(inserted.observaciones) from inserted )
IF @rc > 1000
BEGIN
ROLLBACK TRAN
END

Realicé una traza de la base de datos y me di cuenta que para el insert se ejecutaba un procedimiento almacenado (el que anoté anteriormente). Por lo que este trigger no funcionó.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

mira!!

Publicado por Victor //:-) (12 intervenciones) el 24/05/2005 22:44:28
RECUERDA QUE INSTEAD OF INSERT SIGNIFICA "EN LUGAR DE HACER INSERT HAS ESTO":

CREATE TRIGGER muylargo ON discadomanual INSTEAD OF INSERT
AS

SET ANSI_WARNINGS OFF
DECLARE @rc AS INT
SET @rc = (select len(inserted.observaciones) from inserted )
IF @rc > 1000
BEGIN
ROLLBACK TRAN
END

/*FALTA QUE AGREGUES EL INSERT ORIGINAL VALIDADO*/
INSERT INTO [Agentes].[dbo].[tablaxx]
( [xx1],
[xx2],
[xx3],
[xx4],
[xx5],
[xx6],
[xx7],
[xx8],
[xx9],
[xx10],
[xx11],
[Observaciones])
select
[xx1],
[xx2],
[xx3],
[xx4],
[xx5],
[xx6],
[xx7],
[xx8],
[xx9],
[xx10],
[xx11],
[Observaciones]
from inserted

SALUDOS
atte.
Victor //:-)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:mira!!

Publicado por Christian D. (3 intervenciones) el 25/05/2005 17:21:53
Gracias Victor,
Probé con lo que me dijiste haciéndoles unas modificaciones, pero no me resultó:

IF EXISTS (SELECT name FROM sysobjects
WHERE name = 'muylargo' AND type = 'TR')
DROP TRIGGER muylargo
GO

CREATE TRIGGER muylargo ON discadomanual for INSERT
AS

SET ANSI_WARNINGS off
DECLARE @rc AS INT
SET @rc = (select len(inserted.observaciones) from inserted )
IF ((@rc > 990))
BEGIN
ROLLBACK TRAN
END

else

declare @Agente_1 [varchar](50)
declare @NumeroDiscado_2 [varchar]
declare @FechaHoraInicio_3 [datetime]
declare @FechaHoraWrapUp_4 [datetime]
declare @FechaHoraFin_5 [datetime]
declare @DuracionConversacion_6 [varchar](50)
declare @DuracionWrapUp_7 [varchar](50)
declare @Grabacion_8 [varchar](255)
declare @DescripcionGrabacion_9 [varchar](1000)
declare @Troncal_10 [varchar](50)
declare @Status_11 [varchar](50)
declare @Observaciones_12 [varchar](1000)

select

@Agente_1 = Agente,
@NumeroDiscado_2 = NumeroDiscado,
@FechaHoraInicio_3 = FechaHoraInicio,
@FechaHoraWrapUp_4 = FechaHoraWrapUp,
@FechaHoraFin_5 = FechaHoraFin,
@DuracionConversacion_6 = DuracionConversacion,
@DuracionWrapUp_7 = DuracionWrapUp,
@Grabacion_8 = Grabacion,
@DescripcionGrabacion_9 = DescripcionGrabacion,
@Troncal_10 = Troncal,
@Status_11 = Status,
@Observaciones_12 = Observaciones
from inserted

INSERT INTO [Agentes].[dbo].[DiscadoManual]
( [Agente],
[NumeroDiscado],
[FechaHoraInicio],
[FechaHoraWrapUp],
[FechaHoraFin],
[DuracionConversacion],
[DuracionWrapUp],
[Grabacion],
[DescripcionGrabacion],
[Troncal],
[Status],
[Observaciones])
values
(@Agente_1,
@NumeroDiscado_2,
@FechaHoraInicio_3,
@FechaHoraWrapUp_4,
@FechaHoraFin_5,
@DuracionConversacion_6,
@DuracionWrapUp_7,
@Grabacion_8,
@DescripcionGrabacion_9,
@Troncal_10,
@Status_11,
@Observaciones_12)

Tienes alguna idea de qué más puedo hacer???

Muchas Gracias,
Christian
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:mira!!

Publicado por Victor //:-) (12 intervenciones) el 31/05/2005 23:38:38

CREATE TRIGGER muylargo_DESPUES ON discadomanual for INSERT
AS

SET ANSI_WARNINGS off


IF len(coalesce((select observaciones from inserted ) ,'')) > 990
BEGIN
ROLLBACK TRAN /*ya esta insertado, y con rollback decimos DESHACER TODO LO ANTERIOR INSERTADO.*/
return
END

/*NOTA: ESTAS USANDO UN TRIGGER "DESPUES DE", ESO REQUIERE DECIR QUE EL REGISTRO "YA" SE INSERTO, POR LO TANTO NO NECESITAS VOLVERLO A INSERTAR.*/

/*el codigo tuyo anterior es para TRIGGER INSTEAD OF */
CREATE TRIGGER muylargo_ANTES ON discadomanual INSTEAD OF INSERT
AS

SET ANSI_WARNINGS off


IF len(coalesce((select observaciones from inserted ) ,'')) > 990
BEGIN
/* NO esta insertado, y NO NECESITA rollback*/
return
END
/*ASI LA VALIDACION ANTERIOR ESTA BIEN, SE DEBE REINSERTAR*/
INSERT INTO [Agentes].[dbo].[DiscadoManual]
SELECT *
FROM INSERTED


ESPERO TE SIRVA
Victor //:-)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar