OK. Я получил большую помощь здесь ранее, работая с SQL-сервером до простого... просто не для меня:(... время для решения малого офиса я работайте, поэтому я вернусь больше!
Моя таблица, в которой я сейчас работаю, состоит из 6 столбцов:
- clockDate date not null PK
- userName varchar (50) не null PK
- clockIn время (0)
- breakOut time (0)
- breakIn time (0)
- 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
Вот моя проблема... Если пользователь DID работает в течение дня, я получаю нарушение первичного ключа, потому что хранимая процедура все еще пытается запустить часть INSERT
инструкции и никогда не запускает строку UPDATE
. Я попробовал, чтобы он перевернулся с помощью IF NOT EXISTS
, с тем же результатом. Какая уловка, чтобы заставить IF-ELSE работать в хранимой процедуре? Можно ли это сделать так, как я думаю, или мне нужно изучить инструкцию Merge
? Мой план состоит в том, чтобы запускать хранимые процедуры из простой программы Visual Basic на каждой рабочей станции. Может быть, я нахожусь над моей головой: (К сожалению, мой босс слишком дешев, чтобы просто купить решение для часов!
EDIT:
Спасибо вам за помощь! Я влюбляюсь в этот сайт, вопросы получают ответы ТАК БЫСТРО!!! Вот моя работающая хранимая процедура:
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
Это правильно, или его можно улучшить? Снова благодарим вас ВСЕ СКОЛЬКО!!!