我很抱歉,但这是一个两部分问题。SQL Server 2008 - 如果不存在INSERT ELSE UPDATE
我对SQL非常陌生,正在尝试为我工作的小型办公室开发一个时钟应用程序。我现在正在玩SQL后端,并且对复合语句有疑问。
我被卡住的地方是,如果用户试图计时休息但从未在开始移位时锁定,SQL需要创建一个新行,而不是更新现有的行。
这里是我的尝试:
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构造或语句不受支持”。但是,后面跟着一行消息,当我查看我的时钟表时,它看起来就像我期望的那样。什么是最好的方式来适应这一点?
而这个问题的第二部分是在我的WHERE语句中。是否有函数在clockDate列中获取今天的日期,而不是必须填充今天的日期?试图为构建前端应用程序提前考虑。
IF NOT EXISTS(SELECT * FROM Clock WHERE clockDate = { fn CURRENT_DATE() }) AND userName = 'test')
再次,这给了我我想要的结果,但直到得到一个错误后“在WHERE子句附近‘CURRENT_DATE’。无法分析查询文本错误。”
我希望我已经正确解释了这一点,并感谢您的帮助!
编辑:
@RThomas @ w00te
OK,所以与clockDate如日期字段和分组的时间(0)场,应该这项工作?原因我仍然在收到“复合语句SQL构造或语句不受支持”。语法错误,即使它似乎工作。
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
我的表的结果是:
clockDate userName clockIn breakOut breakIn clockOut
08/10/2012 test NULL 11:24:38 NULL NULL
这就是我想要的结果,但这个错误让我困惑。这是Visual Studio错误还是SQL错误?我会阅读合并声明,谢谢你们的链接。
检查出[合并](http://technet.microsoft.com/en-us/library/bb510625.aspx)语句。 – 2012-08-10 17:32:30
尽管我在下面的答案,我同意其他人关于合并声明是一个很好的方式来处理插入/更新情况,当你不确定值是否已经存在或没有。以下是我重新发布的合并声明的演练。 http://stackoverflow.com/questions/10218101/extremely-simple-t-sql-merge-example-needed-to-help-comprehension/10219581#10219581如果你想了解更多关于它是如何工作的。 – RThomas 2012-08-10 18:06:48
这就是MERGE语句的用法!检查出来http://technet.microsoft.com/en-us/library/bb510625.aspx – curiousBoy 2013-08-16 21:25:13