我有以下代码,我试图用它来检查一个值是否已经存储在db中。
IF EXISTS
(
SELECT * FROM [Clock] WHERE [clockIn] ='12/03/2016'
AND UserName = 'ROSE'
)
BEGIN
RAISERROR('CLOCK IS TRUE NOTHING MORE TO DO',16 ,1)
ROLLBACK TRAN
END
ELSE
IF NOT EXISTS
(
SELECT * FROM [Clock] WHERE [clockIn] ='12/03/2016'
AND UserName = 'ROSE'
)
BEGIN
INSERT INTO [Clock] ([clockIn], [UserName])
VALUES(GetDate(), 'Rose')
END
我不完全确定为什么这样做有效,因为似乎总是在数据库中插入一个新行并且我很困惑。我使用以下作为示例SQL Server IF NOT EXISTS Usage?以及SQL Server 2008 - IF NOT EXISTS INSERT ELSE UPDATE作为参考。
答案 0 :(得分:1)
代码对我来说似乎没问题 - 但IF NOT EXISTS
案例中的ELSE
是多余的 - 您已经检查并找回了该值不存在的事实 - 所以确实没有必要再次检查 。
但是:您要检查是否存在一个字符串文字中指定固定日期的行 - 今天 ,但不是明天再来。我建议首先将当前日期输入变量,然后将该变量用于检查和可能的插入。
-- store today's date in a variable
DECLARE @Today DATE = SYSDATETIME();
-- check if that row already exists in table
IF EXISTS (SELECT * FROM [Clock]
WHERE [clockIn] = @Today AND UserName = 'ROSE')
BEGIN
RAISERROR('CLOCK IS TRUE NOTHING MORE TO DO',16 ,1)
ROLLBACK TRAN
END
ELSE
BEGIN
INSERT INTO [Clock] ([clockIn], [UserName])
VALUES(@Today, 'Rose')
END
作为旁注:我建议在将日期指定为字符串文字时使用 ISO-8601 格式 - YYYYMMDD
。该格式适用于您(以及其他任何人)SQL Server中的任何语言和/或区域设置,而任何其他格式可能依赖于设置,并且可能无法一直有效!