首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >SQL Server 2008 -如果不存在则插入ELSE UPDATE

SQL Server 2008 -如果不存在则插入ELSE UPDATE
EN

Stack Overflow用户
提问于 2012-08-11 01:29:04
回答 2查看 474.6K关注 0票数 76

我很抱歉,但这是一个两部分的问题。

我对SQL非常陌生,正在尝试为我工作的小办公室开发一个时钟应用程序。我现在正在使用SQL后端,有一个关于复合语句的问题。

我被困住的地方是,如果用户试图退出休息,但从未在轮班开始时打卡,SQL需要创建新行,而不是更新现有行。

这是我尝试过的:

代码语言:javascript
复制
    IF NOT EXISTS(SELECT * FROM Clock WHERE clockDate = '08/10/2012') AND userName = 'test')
    BEGIN
        INSERT INTO Clock(clockDate, userName, breakOut)
        VALUES({ fn NOW() }, 'test', { fn NOW() })
    END
    ELSE
    BEGIN
        UPDATE Clock
        SET breakOut = { fn NOW() }
        WHERE (clockDate = '08/10/2012') AND (userName = 'test')
    END

我使用Visual Studio 2010连接到本地计算机上的SQL Server Express 2008来完成此操作。我得到一个错误,说“复合语句SQL结构或语句不受支持”。然而,紧随其后的是一条消息,指出1行已经受到影响,当我查看我的时钟表时,它看起来就像我期望的那样。最好的解决方法是什么?

这个问题的第二部分在我的WHERE语句中。有没有一个函数可以在clockDate列中获取今天的日期,而不必填充今天的日期?我只是想提前考虑如何构建前端应用程序。

代码语言:javascript
复制
    IF NOT EXISTS(SELECT * FROM Clock WHERE clockDate = { fn CURRENT_DATE() }) AND userName = 'test')

这又一次给出了我想要的结果,但直到出现错误"Error in WHERE子句靠近'CURRENT_DATE'. Unable to parse query text“之后。

我希望我已经正确地解释了这一点,并感谢您的帮助!

编辑:

@RThomas @w00te

好的,那么使用clockDate作为日期字段,breakOut作为时间(0)字段,应该可以这样做吗?因为我仍然收到“不支持复合语句SQL结构或语句”的提示。语法错误,即使它似乎是工作的。

代码语言:javascript
复制
    IF NOT EXISTS (SELECT * FROM Clock WHERE (clockDate = GETDATE()) AND (userName = 'test'))
    BEGIN
        INSERT INTO Clock(clockDate, userName, breakOut)
        Values(GETDATE(), 'test', GETDATE())
    END
    ELSE
    BEGIN
        UPDATE Clock
        SET breakOut = GETDATE()
        WHERE (clockDate = GETDATE()) AND (userName = 'test')
    END

我的表结果是:

代码语言:javascript
复制
clockDate  userName  clockIn  breakOut  breakIn  clockOut

08/10/2012  test      NULL    11:24:38   NULL     NULL

这是我想要的结果,但是这个错误把我搞糊涂了。这是Visual Studio错误还是SQL错误?我将阅读Merge语句,感谢你们提供的链接。

EN

回答 2

Stack Overflow用户

发布于 2012-08-11 01:31:43

代码语言:javascript
复制
IF NOT EXISTS(SELECT * FROM Clock
WHERE clockDate = '08/10/2012') AND userName = 'test')

有一个额外的括号。我觉得如果你把它去掉也没问题:

代码语言:javascript
复制
IF NOT EXISTS(SELECT * FROM Clock WHERE
clockDate = '08/10/2012' AND userName = 'test')

此外,GETDATE()将把当前日期放在列中,但是如果您不想要这个时间,那么您就得玩一玩。我认为CONVERT(varchar(8),GETDATE(),112)只会给出日期(而不是时间)部分。

代码语言:javascript
复制
IF NOT EXISTS(SELECT * FROM Clock WHERE
clockDate = CONVERT(varchar(8), GETDATE(), 112)
AND userName = 'test')

也许应该这么做。

PS:使用merge语句:)

票数 5
EN

Stack Overflow用户

发布于 2012-08-11 01:35:55

您需要将其替换为WHERE clockDate = { fn CURRENT_DATE() } AND userName = 'test'。请从{ fn CURRENT_DATE() })中删除额外的")"

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11906506

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档