PDA

Ver la Versión Completa : problemilla con procedimiento almacenado


kejos
11-01-2006, 15:43:07
hola a todos!!!!
tengo un pequeño problemilla con un procedimiento almacenado....
mi procedimiento es de inserción y es el siguiente:


CREATE procedure spActHist (@docidentidad varchar(30),
@fechaincon datetime,
@fechafincon datetime,
@idtipocontrato int, @idtipovincu int) AS
if not exists (select [idtipocontrato], [idtipovincu]
from Historico
where [docidentidad]=@docidentidad)
insert into [Historico]
([docidentidad], [fechaincon], [fechafincon], [idtipocontrato], [idtipovincu])
values
(@docidentidad, @fechaincon, @fechafincon, @idtipocontrato, @idtipovincu)


pero cuando voy a la ejecución de mi programa no me funciona y cuando le quito el if not exists hay si me inserta entonces no entiendo el porque de esto y básicamente lo que necesito es que me inserte siempre y cuando esos 2 valores que estan en el select del if not exists no sean iguales a los que entro entonces estoy algo confundida con esto a quien me pueda ayudar se lo agradezco....

:D :) :rolleyes:

lucasarts_18
11-01-2006, 16:01:26
Hola:

Usa los Tag para que el código sea mas legible, no sé si es obligatorio usar los begin end cuando pones un if, yo siempre los utilizo, te recomiendo encarecidamente que veas los Book on Line de SQL Server, casi todo está allí, tiene muy buenos ejemplos y muy bien explicados.;)

Hasta Luego -

delphi.com.ar
11-01-2006, 16:11:23
pero cuando voy a la ejecución de mi programa no me funciona y cuando le quito el if not exists hay si me inserta entonces no entiendo el porque de esto y básicamente lo que necesito es que me inserte siempre y cuando esos 2 valores que estan en el select del if not exists no sean iguales a los que entro entonces estoy algo confundida con esto a quien me pueda ayudar se lo agradezco....

Por favor.. un signo de puntuación!.. tu enunciado es incomprensible (al menos para mi :p)
El código del store no es demasiado complejo como para ver que es lo que hace,
¿Que pasas si ejecutas el store desde la consola (QueryAnalyzer)?... ¿Estas segura que los datos tienen lo que crees que tiene?

Xianto
11-01-2006, 17:02:27
pero cuando voy a la ejecución de mi programa no me funciona y cuando le quito el if not exists hay si me inserta entonces no entiendo el porque de esto y básicamente lo que necesito es que me inserte siempre y cuando esos 2 valores que estan en el select del if not exists no sean iguales a los que entro entonces estoy algo confundida con esto a quien me pueda ayudar se lo agradezco....


Dios, juro que tampoco lo entiendo !

Intenta explicarte un poco mejor...

pepon386
13-01-2006, 15:59:31
Prueba a hacerlo de la siguiente manera (no lo he probado, así que a lo mejor hay algún error de sintaxis):


CREATE procedure spActHist (@docidentidad varchar(30),
@fechaincon datetime,
@fechafincon datetime,
@idtipocontrato int, @idtipovincu int),
@EXISTE int AS
select Count(*) as @EXISTE
from Historico
where [docidentidad]=@docidentidad
if (@Existe = 0) then
begin
insert into [Historico]
([docidentidad], [fechaincon], [fechafincon], [idtipocontrato], [idtipovincu])
values
(@docidentidad, @fechaincon, @fechafincon, @idtipocontrato, @idtipovincu)
end

delphi.com.ar
13-01-2006, 16:16:04
Prueba a hacerlo de la siguiente manera (no lo he probado, así que a lo mejor hay algún error de sintaxis):


CREATE procedure spActHist (@docidentidad varchar(30),
@fechaincon datetime,
@fechafincon datetime,
@idtipocontrato int, @idtipovincu int),
@EXISTE int AS
select Count(*) as @EXISTE
from Historico
where [docidentidad]=@docidentidad
if (@Existe = 0) then
begin
insert into [Historico]
([docidentidad], [fechaincon], [fechafincon], [idtipocontrato], [idtipovincu])
values
(@docidentidad, @fechaincon, @fechafincon, @idtipocontrato, @idtipovincu)
end


¿Es válido "select Count(*) as @EXISTE"?
Igualmente no recomiendo hacer un Count para saber si hay como mínimo un registro, simplemente porque el count se ejecuta completo, si la tabla es algo grande, imagínesen!

Viendo nuevamente la pregunta de kejos, puedo suponer, que exita una UK o PK compuesta en la tabla históricos, y supongo nuevamente que comete el error en el exists solo filtrando por uno de los campos:

CREATE procedure spActHist (@docidentidad varchar(30),
@fechaincon datetime,
@fechafincon datetime,
@idtipocontrato int, @idtipovincu int) AS
if not exists (select 1
from Historico
where [docidentidad]=@docidentidad
and [idtipocontrato] = @idtipocontrato
and [idtipovincu] = @idtipovincu)
insert into [Historico]
([docidentidad], [fechaincon], [fechafincon], [idtipocontrato], [idtipovincu])
values
(@docidentidad, @fechaincon, @fechafincon, @idtipocontrato, @idtipovincu)

Kejos sería bueno que des alguna señal!

Xianto
13-01-2006, 17:02:34
Bueno, yo diria que en vez de: select 1 from Historico

Debería ser: select top 1 * from Historico

Y lo de: select Count(*) as @EXISTE from...

No funcionaria, que el as es para el nombre del campo de salida...

Debería ser: select @EXISTE=Count(*) from...

Pero igualmente estoy de acuerdo con Federico, sobre como hacerlo.

Chente(rMan)
13-01-2006, 18:48:20
¿Y si lo intentas asi?

hola a todos!!!!

CREATE procedure [spActHist]
@docidentidad varchar(30),
@fechaincon datetime,
@fechafincon datetime,
@idtipocontrato int,
@idtipovincu int
AS
if not exists (select 1 from Historico
where docidentidad = @docidentidad)
begin
insert into Historico (docidentidad, fechaincon, fechafincon, idtipocontrato, idtipovincu)
values (@docidentidad, @fechaincon, @fechafincon, @idtipocontrato, @idtipovincu)



Si puedes volver a detallar te podremos ayudar mejor.


Suerte.