2010-09-14 46 views
2

,我希望用下面的更新\插入方法,以加快我的應用程序中插入\更新:是否存在更新否則用VB.net(SQL參數化查詢)將

UPDATE [Application_Type_Table] 
SET ApplicationType='Test Value' 
WHERE ID='1' 
IF @@ROWCOUNT=0 
INSERT INTO [Application_Type_Table] VALUES ('Test Value') 

我將如何做到這一點與SQL參數?由於@@,rowcount函數將作爲參數提取。

sqlCommand.CommandText = _ 
"UPDATE [Application_Type_Table]" _ 
SET (SET [email protected]" _ 
"WHERE [email protected] IF @@ROWCOUNT=0 INSERT INTO [Application_Type_Table] VALUES (@TestValue)" 

http://blogs.msdn.com/b/miah/archive/2008/02/17/sql-if-exists-update-else-insert.aspx

+1

您確定這是問題嗎?我見過'sqlCommand.CommandText =「SELECT @@ IDENTITY」'多次使用,而@ -signs不會造成問題。 – Heinzi 2010-09-14 12:25:33

+0

你有什麼錯誤? – 2010-09-14 12:53:55

回答

4

這種模式被稱爲UPSERT。現在這樣做的方法是在SQL Server 2008中使用MERGE,例如

MERGE INTO Application_Type_Table AS target 
USING (
     VALUES (@RecordID, @TestValue) 
    ) AS source (ID, ApplicationType) 
    ON target.ID = source.ID 
WHEN MATCHED 
    THEN UPDATE 
      SET ApplicationType = source.ApplicationType 
WHEN NOT MATCHED 
    THEN INSERT (ID, ApplicationType) 
      VALUES (ID, ApplicationType); 
+0

這種性能與上述方法相比如何? – madlan 2010-09-14 18:29:46

+1

@madlan:理論上MERGE可以更好地優化,因爲它只需要執行一次。與表現一樣,它取決於許多因素。請參閱:優化MERGE語句性能(http://technet.microsoft.com/zh-cn/library/cc879317.aspx)。 – onedaywhen 2010-09-15 07:06:24

-1

我建議查詢移動到存儲過程。查詢(特別是多語句)並不真正屬於應用程序IMO的硬編碼。這樣做也有減輕你的問題的獎勵;)

+0

我認爲是相反的。對於基本的CRUD內容,SP是很好的;但不是更復雜的多語句子例程。十年前,將應用程序設想爲「一個帶有一些商業代碼的數據庫」是很常見的。但是今天我們對軟件應用的定義是不同的。業務層位於數據庫之外。就性能而言,DBMS重用任何SQL語句的執行計劃,而不僅僅是存儲過程,因此編譯後的性能相當。 – 2012-10-13 14:40:12

0
sqlCommand.CommandText = "IF NOT EXISTS (SELECT 1 FROM [Application_Type_Table] WHERE "_ 
"ID='1') BEGIN INSERT INTO " _ 
"[Application_Type_Table] VALUES ('Test Value') END ELSE BEGIN UPDATE [Application_Type_Table]"_ 
"SET ApplicationType='Test Value'"_ 
"WHERE ID='1' END"