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

error de sintaxis

Estas en el tema de error de sintaxis en el foro de SQL Server en Foros del Web. hola! sigo en mi largo camino de aprendizaje y bueno estoy hacieno un trigger que verifique en otra tabla(fuera de esa base de dato) ciertos ...
  #1 (permalink)  
Antiguo 14/09/2006, 13:52
Avatar de Claudiss  
Fecha de Ingreso: septiembre-2006
Mensajes: 8
Antigüedad: 17 años, 7 meses
Puntos: 0
error de sintaxis

hola!
sigo en mi largo camino de aprendizaje y bueno estoy hacieno un trigger que verifique en otra tabla(fuera de esa base de dato) ciertos codigos. he hice el siguiente trigger:

select g.tipotransaccion,g.estadotransaccion from geo_transaccion g
inner join CENSO.dbo.CODIGOS c on g.tipotransaccion COLLATE SQL_Latin1_General_CP1_CI_AS = c.codigo
and g.estadotransaccion COLLATE SQL_Latin1_General_CP1_CI_AS = c.codigo
where c.clasificacion ='TIPOTRANSACCION' and c.clasificacioN='ESTADOTRANSACCION'

if (g.tipotransaccion COLLATE SQL_Latin1_General_CP1_CI_AS <> c.codigo)

BEGIN
RAISERROR ('EL CODIGO NO ES CORRECTO',21,63)
ROLLBACK TRANSACTION
END


if (g.estadotransaccion COLLATE SQL_Latin1_General_CP1_CI_AS <> c.codigo)
/* begin
insert into geo_transaccion (ESTADOTRANSACCIO)
end
else*/
BEGIN
RAISERROR ('EL CODIGO NO ES CORRECTO',21,63)
ROLLBACK TRANSACTION
END

al momento de compilarlo no tengo ningun error

pero al ejecutarlo me dice lo siguiente:
Server: Msg 107, Level 16, State 2, Procedure VERIFICA_ID_CODIGO, Line 12
The column prefix 'g' does not match with a table name or alias name used in the query.

ahora no se si es que tengo que declarar las variables antes...o que tipo de alias debo de utilizar.

Agradezco de antemano su ayuda
  #2 (permalink)  
Antiguo 14/09/2006, 14:26
Avatar de Mithrandir
Colaborador
 
Fecha de Ingreso: abril-2003
Mensajes: 12.106
Antigüedad: 21 años
Puntos: 25
Para ser un trigger no veo ninguna tabla Inserted o Deleted, entonces no veo por que la necesidad de tal trigger.

if (g.tipotransaccion COLLATE SQL_Latin1_General_CP1_CI_AS <> c.codigo)

Ese código ya está fuera del select, de ahí que la referencia a g.tipotransaccion está fuera de contexto.
__________________
"El hombre, en su orgullo, creó a Dios a su imagen y semejanza."
Friedrich Nietzsche
  #3 (permalink)  
Antiguo 14/09/2006, 15:12
Avatar de Claudiss  
Fecha de Ingreso: septiembre-2006
Mensajes: 8
Antigüedad: 17 años, 7 meses
Puntos: 0
bueno lo que yo quiero que al momento de insertar un nuevo registro, e en el cual van ciertos codigos. y en caso de ingresar un codigo que no es, el trigger se dispara y me mande el mensaje de erros

originalmente hice este otro, pero no me valido nunca
declare
@tipotransaccion varchar(3),
@estadotransaccion varchar(8),
@codigo varchar(10)

select @tipotransaccion=g.tipotransaccion, @estadotransaccion=g.estadotransaccion
from geo_transaccion g
inner join CENSO.dbo.CODIGOS c
on @tipotransaccion COLLATE SQL_Latin1_General_CP1_CI_AS = @codigo
and @estadotransaccion COLLATE SQL_Latin1_General_CP1_CI_AS = @codigo
where c.clasificacion ='TIPOTRANSACCION' and c.clasificacioN='ESTADOTRANSACCION'

if (@tipotransaccion COLLATE SQL_Latin1_General_CP1_CI_AS <> @codigo)

BEGIN
RAISERROR ('EL CODIGO NO ES CORRECTO',21,63)

ROLLBACK TRANSACTION
end

if (@estadotransaccion COLLATE SQL_Latin1_General_CP1_CI_AS <> @codigo)

BEGIN
RAISERROR ('EL CODIGO NO ES CORRECTO',21,63)
ROLLBACK TRANSACTION
END
  #4 (permalink)  
Antiguo 15/09/2006, 13:25
Avatar de Mithrandir
Colaborador
 
Fecha de Ingreso: abril-2003
Mensajes: 12.106
Antigüedad: 21 años
Puntos: 25
Idealmente ese proceso lo harás con un FK (foreign key) de una tabla con los códigos aceptables (probablemente el propio catálogo de códigos) ligada a esta tabla. De esa manera no puedes brincarte las trancas e insertar códigos inexistentes.

¿Hay algo que impida que trabajes de esa manera? Utilizar triggers creeme que complica el tema de la administración de la DB.

El segundo código tiene además la desventaja que de asumes que siempre insertarás/editarás un solo registro, lo cual no puede ser cierto en el mundo real (asumir que así será me parece una mala práctica). Si vemos que es indispensable el trigger te ayudo a hacerlo un poco más robusto.
__________________
"El hombre, en su orgullo, creó a Dios a su imagen y semejanza."
Friedrich Nietzsche
  #5 (permalink)  
Antiguo 21/09/2006, 16:18
Avatar de Claudiss  
Fecha de Ingreso: septiembre-2006
Mensajes: 8
Antigüedad: 17 años, 7 meses
Puntos: 0
Hola! no se porque no se cargo el otro mensaje.. pero bueno..
pues la cosa es que solo queremos validar codigos. mira en Oracle tenemos una funcion que me permite ejecutar los trigger para validar codigos y en caso de que al momento de insertar un nuevo registro y vaya un codigo malo, el trigger se dispare y mande el mensaje de error.

y es eso lo que quiero hacer en sql. pero no me sale
  #6 (permalink)  
Antiguo 21/09/2006, 21:25
Avatar de Mithrandir
Colaborador
 
Fecha de Ingreso: abril-2003
Mensajes: 12.106
Antigüedad: 21 años
Puntos: 25
Entonces prueba que tu sentencia sea algo como

IF EXISTS(
--revisas si existen registros en Inserted que no existan en Codigos
SELECT * FROM Inserted I LEFT OUTER JOIN CENSO.dbo.CODIGOS C
ON I.llave = C.llave
WHERE C.llave IS NULL
)
BEGIN
RAISERROR('Error', 16, 1)
ROLLBACK TRANSACTION
END
__________________
"El hombre, en su orgullo, creó a Dios a su imagen y semejanza."
Friedrich Nietzsche
  #7 (permalink)  
Antiguo 22/09/2006, 10:02
Avatar de Claudiss  
Fecha de Ingreso: septiembre-2006
Mensajes: 8
Antigüedad: 17 años, 7 meses
Puntos: 0
Gracias eres muy amable
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 15:55.