如何检查数据库中是否存在值

时间:2016-03-12 10:47:24

标签: sql sql-server sql-server-2012

我有以下代码,我试图用它来检查一个值是否已经存储在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作为参考。

1 个答案:

答案 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中的任何语言和/或区域设置,而任何其他格式可能依赖于设置,并且可能无法一直有效!