Хранимая процедура SQL IF EXISTS UPDATE ELSE INSERT

ХОРОШО. Я получил большую помощь здесь ранее работал с серверной частью SQL до простого... просто не для меня :(... решение для часов для небольшого офиса, в котором я работаю, поэтому я назад для больше!

Моя таблица, с которой я сейчас работаю, состоит из 6 столбцов:

  1. дата clockDate не нулевая ПК
  2. userName varchar (50 )не нуль PK
  3. часыВремя (0)
  4. Время отключения (0)
  5. Время перерыва (0)
  6. ClockOut time (0)

Хотя я понял свое утверждение IF NOT EXISTS INSERT ELSE UPDATEиз моего последнего вопроса, но теперь я безуспешно пытаюсь использовать его в хранимой процедуре, а не в обычном окне запроса.

По сути, пользователь, регистрирующий время, -не представляет сложности. Однако, если пользователь не приходит, но уходит на обед, инструкция должна создать строку вместо обновления существующей строки.Итак, вот моя хранимая процедура:

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

Вот моя проблема... Если пользователь ДЕЙСТВУЕТ часы в течение дня, я получаю нарушение первичного ключа, потому что хранимая процедура все еще пытается запустить часть оператора INSERTи никогда не запускает строку UPDATE. Я пробовал перевернуть с помощью IF NOT EXISTSс тем же результатом. Как заставить IF -ELSE работать в хранимой процедуре? Можно ли это сделать так, как я думаю, или мне нужно изучить утверждение Merge? Я планирую запускать хранимые процедуры из простой программы Visual Basic на каждой рабочей станции. Может быть, я вхожу в заблуждение :(Жаль, что мой босс слишком скуп, чтобы просто купить решение для часов!

РЕДАКТИРОВАТЬ:

Спасибо за вашу помощь!! Я влюбился в этот сайт, вопросы получают ответы ТАК БЫСТРО!!! Вот моя рабочая хранимая процедура:

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

Это нормально или можно еще улучшить? Еще раз ВСЕМ ОГРОМНОЕ СПАСИБО!!!

17
задан JP Hellemons 11 July 2017 в 09:45
поделиться