Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   MS SQL Server (https://www.clubdelphi.com/foros/forumdisplay.php?f=23)
-   -   problemilla con procedimiento almacenado (https://www.clubdelphi.com/foros/showthread.php?t=29063)

kejos 11-01-2006 15:43:07

problemilla con procedimiento almacenado
 
hola a todos!!!!
tengo un pequeño problemilla con un procedimiento almacenado....
mi procedimiento es de inserción y es el siguiente:

Código SQL [-]
 
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

Cita:

Empezado por kejos
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

Cita:

Empezado por kejos
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):

Código SQL [-]
 
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

Cita:

Empezado por pepon386
Prueba a hacerlo de la siguiente manera (no lo he probado, así que a lo mejor hay algún error de sintaxis):

Código SQL [-]
 
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:
Código SQL [-]
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?

Cita:

Empezado por kejos
hola a todos!!!!
Código SQL [-]
 
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.


La franja horaria es GMT +2. Ahora son las 16:05:01.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi