如果已有记录,如何插入或更新?

时间:2014-02-07 12:49:19

标签: sql sql-server-ce

我的表格有两列:AmountDate

当我添加新值时,如果已有该日期的记录,我想更新金额。如果没有,我想插入我的新值。

4 个答案:

答案 0 :(得分:3)

类似的东西:

if exists(select * from table where date = @date)
    update table set amount = @amount where date = @date
else
    insert table (amount, date) select @amount, date

答案 1 :(得分:3)

假设您至少拥有SQL Server 2008,则可以使用MERGE关键字。此关键字专门针对像您这样的案例添加。你指定一个MERGE子句(基本上是一个连接),然后告诉它如何处理或找不到匹配。

底部有一个不错的例子,它显示了目标表和由单行参数创建的源“表”之间的合并。要把它煮沸一点,你可以使用类似的东西:

MERGE [TargetTable] AS target -- This is the table we'll be updating
    USING (SELECT @Date) AS source (Date) -- These are the new values
    ON (target.Date = source.Date) -- Here we define how we find a "match"
WHEN MATCHED THEN  -- If the date already exists:
    UPDATE SET Amount = @Amount
WHEN NOT MATCHED THEN -- If the date does not already exist:
    INSERT (Date, Amount) VALUES (@Date, Amount)

请注意,嵌套的UPDATEINSERT子句不指定表。这是因为我们已经告诉SQL Server哪个表在我们定义目标表(在MERGE关键字之后指定的表)时执行这些操作。

更新:此功能显然是SQL Server CE的not supported,因此在您的特定情况下无效。我在这里留下这个答案,因为它可能有助于其他人尝试在完整版本的SQL Server中做类似的事情。 对于SQL Server CE解决方案,请查看BJury's answer。

答案 2 :(得分:1)

作为IF .. NOT EXISTS的替代方法,您可以断言UPDATE,然后返回插入。如果数据通常已经存在,这通常是一种高效的UPSERT模式。

UPDATE MyTable
  SET Amount = @NewAmount
  WHERE Date = @Date;

IF @@ROWCOUNT = 0
  INSERT INTO MyTable(Amount, Date) VALUES (@NewAmount, @Date);

答案 3 :(得分:0)

如果您使用的是nhibernate ORM,那么您可以使用SaveOrUpdate会话方法。