2014-02-07 90 views

回答

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 
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條款不指定表。這是因爲當我們定義我們的目標表(在MERGE關鍵字後指定的表)時,我們已經告訴SQL Server哪個表執行這些操作。

更新:此功能顯然是SQL Server CE的not supported,所以它不適用於您的特定情況。我在這裏留下這個答案,因爲它可能會幫助其他人嘗試在完整版SQL Server中執行類似的操作。 對於SQL Server CE解決方案,請查看BJury's的答案。

+1

不幸的是,[ce不支持合併](http://stackoverflow.com/questions/14091092/does-sql-server-ce-supports-merge-statement),但對MERGE的一個非常好的解釋的榮譽。 – StuartLC

+0

這很傷心。這對於這種情況非常有用。感謝您指出了這一點。 –

0

如果您使用的是nhibernate ORM,那麼您可以使用SaveOrUpdate會話方法。

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); 
+0

而且它看起來像CE不支持[@@ ROWCOUNT](http://technet.microsoft.com/en-us/library/ms173372.aspx) – StuartLC

相關問題