【问题标题】:How to check if a value exists in the database如何检查数据库中是否存在值
【发布时间】:2016-03-12 10:47:24
【问题描述】:

我有以下代码,我试图用它来检查一个值是否已经存储在数据库中。

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 为例,作为参考。

【问题讨论】:

  • 您的 ClockIn 数据类型是日期吗?如果是日期时间,那么您还将有小时、分钟等,并且您的比较将不匹配。使用特定国家/地区的日期格式是个坏主意,请改用 YYYYMMDD。
  • 感谢@JamesZ 的回复。我的字段是数据类型 DATE。如果我将其转换为 datetimw 的数据类型,这将有助于解决我的问题吗?
  • 您正在添加具有getdate 值的行,但尝试使用常量日期过滤器来定位它们。此外,您的日期格式不是区域安全的。试试“20160312”

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


【解决方案1】:

代码对我来说似乎没问题 - 但 ELSE 案例中的 IF NOT EXISTS 是多余的 - 你已经 检查过 并找回了该值不存在的事实 - 所以真的没有必要再次检查

但是:您正在检查是否存在具有在字符串文字中指定的固定日期的行 - 这将在今天工作,但明天就不行了。我建议首先将当前日期放入一个变量中,然后将该变量用于检查和可能的插入。

-- 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 中的任何语言和/或区域设置,而任何其他格式可能取决于设置,并且可能无法始终有效!

【讨论】:

    猜你喜欢
    • 2016-09-21
    • 2012-07-02
    • 1970-01-01
    • 1970-01-01
    • 2020-07-15
    • 2016-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多