OK. Ho ricevuto molto aiuto here in precedenza con un backend SQL per un semplice ... non solo per me :(... soluzione di orologio per il piccolo ufficio in cui lavoro, quindi sono tornato per di più!SQL stored procedure SE EXISTS UPDATE ELSE INSERT
Il mio tavolo sto attualmente lavorando con composta da 6 colonne:
- data clockDate non nullo PK
- userName varchar (50) NOT NULL PK
- tempo clockin (0)
- tempo breakout (0)
- tempo di interruzione (0)
- tempo ClockOut (0)
io se avevo capito il mio IF NOT EXISTS INSERT ELSE UPDATE
dichiarazione dalla mia ultima domanda, ma ora sto cercando di usarlo in una stored procedure, piuttosto che una query semplice finestra, senza successo.
Fondamentalmente un utente che esegue il clocking è un gioco da ragazzi. Tuttavia, se l'utente non effettua il clock, ma si fermano a pranzo, l'istruzione deve creare la riga anziché aggiornare una riga esistente. Ok, quindi ecco la mia stored procedure:
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
Ecco il mio problema ... Se l'utente DID orologio per il giorno ricevo una violazione di chiave primaria perché la stored procedure sta ancora cercando di eseguire la parte INSERT
della dichiarazione e non esegue mai la linea UPDATE
. L'ho provato capovolto con uno IF NOT EXISTS
con lo stesso risultato. Qual è il trucco per far funzionare IF-ELSE in una stored procedure? Questo può essere fatto nel modo in cui sto pensando o devo studiare la dichiarazione Merge
? Il mio piano è di eseguire le stored procedure da un semplice programma Visual Basic su ogni workstation. Forse sto ricevendo in sopra la mia testa :(Per male il mio capo è troppo a buon mercato per comprare solo una soluzione orologio in tempo
EDIT:
Grazie a tutti per il vostro aiuto !! sto cadendo innamorato di questo sito, le domande ottenere risposte così veloce !!! Ecco il mio lavoro stored procedure:?
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
è questo corretto, o potrebbe essere migliorato di più ancora una volta grazie a tutti così tanto !!!
E 'il tuo istruzione IF - esistono solito un record con il tempo di GETDATE() perché questo è ora, in quanto restituisce il tempo, troppo! Quello che vuoi fare è vedere se esiste già un record per quell'utente in quella data. – dash
Grazie @dash !! – tmhalbert