我的表格有两列:Amount
和Date
当我添加新值时,如果已有该日期的记录,我想更新金额。如果没有,我想插入我的新值。
答案 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)
请注意,嵌套的UPDATE
和INSERT
子句不指定表。这是因为我们已经告诉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会话方法。