OK. Obtuve mucha ayuda here trabajando antes con un backend de SQL a un simple ... simplemente no para mí :(... solución de reloj de tiempo para la pequeña oficina en la que trabajo, ¡así que estoy de vuelta para más!Procedimiento almacenado SQL SI EXISTE ACTUALIZAR EL RESTO INSERT
Mi mesa Actualmente estoy trabajando con consta de 6 columnas:
- fecha clockDate no PK nula
- varchar nombre de usuario (50) no nula PK
- tiempo clockin (0)
- tiempo Breakout (0)
- breakIn time (0)
- tiempo Clockout (0)
aunque yo había descubierto mi declaración IF NOT EXISTS INSERT ELSE UPDATE
de mi última pregunta, pero ahora estoy tratando de utilizarlo en un procedimiento almacenado, en lugar de una consulta sencilla ventana, sin éxito.
Básicamente un registro de usuario es una obviedad. Sin embargo, si el usuario no marca el reloj, pero salen a comer, la declaración debe crear la fila en lugar de actualizar una fila existente. La autorización así que aquí está mi procedimiento almacenado:
ALTER PROCEDURE dbo.BreakOut
(
@userName varchar(50)
)
AS
IF EXISTS (SELECT * FROM Clock WHERE clockDate = GETDATE() AND userName = @userName)
BEGIN
UPDATE Clock SET breakOut = GETDATE()
WHERE clockDate = GETDATE() AND userName = @userName
END
ELSE
BEGIN
INSERT INTO Clock (clockDate, userName, breakOut)
VALUES (GETDATE(), @userName, GETDATE())
END
Aquí es mi problema ... Si el usuario DID reloj en el día recibo una violación clave primaria debido a que el procedimiento almacenado todavía está tratando de ejecutar la parte INSERT
de la declaración y nunca ejecuta la línea UPDATE
. Lo intenté con un IF NOT EXISTS
también con el mismo resultado. ¿Cuál es el truco para hacer que IF-ELSE funcione en un procedimiento almacenado? ¿Se puede hacer esto de la manera que estoy pensando o tengo que estudiar la declaración Merge
? Mi plan es ejecutar los procedimientos almacenados desde un simple programa de Visual Basic en cada estación de trabajo. Tal vez me estoy poniendo en mi cabeza :(A malo mi jefe es demasiado barato para comprar una solución de reloj de tiempo
EDITAR:
gracias a todos por su ayuda !! estoy cayendo enamorada de este sitio, preguntas obtienen respuestas tan rápido !!! Aquí está mi procedimiento almacenado de trabajo:?
ALTER PROCEDURE dbo.BreakOut
(
@userName varchar(50)
)
AS
IF EXISTS (SELECT * FROM Clock WHERE DateDiff(dd, GetDate(),clockDate) = 0 AND userName = @userName)
BEGIN
UPDATE Clock SET breakOut = GETDATE()
WHERE DateDiff(dd, GetDate(),clockDate) = 0 AND userName = @userName
END
ELSE
BEGIN
INSERT INTO Clock (clockDate, userName, breakOut)
VALUES (GETDATE(), @userName, GETDATE())
END
¿es esta correcta, o se podría mejorar más Una vez más gracias a todos TANTO !!!
es su instrucción IF - no suele existir un registro con el tiempo GETDATE() porque eso es ahora, ya que devuelve el tiempo, también! Lo que quiere hacer es ver si ya existe un registro para ese usuario en esa fecha. – dash
Gracias @dash !! – tmhalbert