2016-03-07 83 views
0

我的目標是讓SQL檢查該行是否存在,如果它更新,如果不插入。SQL如果不存在插入else更新,根據列ID

FTP_num是第一列的名稱。 SQL Statement是

using (SqlCommand cmd = new SqlCommand("IF NOT EXISTS(SELECT ftp_num from Distributor WHERE fpt_num = FTP_num)" 
" insert FTP_Info set [email protected], [email protected], [email protected], [email protected], [email protected] where FTP_num = @ftp_num" + 
" else" + 
" update FTP_Info set [email protected], [email protected], [email protected], [email protected], [email protected] where FTP_num = @ftp_num", con)) 

我沒有太多的SQL經驗,任何幫助表示讚賞。

Line 120: 
Line 121:    con.Open(); 
Line 122:    cmd.ExecuteNonQuery(); 
Line 123:    con.Close(); 
Line 124:   } 
+1

您使用的是什麼RDBMS? –

+0

基於c#代碼使用SqlCommand我猜對了Sql server –

+0

Microsoft SQL Server。 SQL Server 2014 –

回答

2

前面已經提出,MERGE語句是非常合適的位置,因爲它可以在原子指令執行INSERTUPDATEDELETE

using (SqlCommand cmd = new SqlCommand(@" 
    MERGE Distributor AS T 
    USING (VALUES(@IP, @Port, @UN, @PW, @Folder, @FTP_Num) AS S 
     (IP, Port, UN, PW, Folder, FTP_num) 
    ON S.FTP_num = T.FTP_num 
    WHEN NOT MATCHED THEN 
     INSERT VALUES (S.IP, S.Port, S.UN, S.PW, S.Folder, S.FTP_num); 
    WHEN MATCHED THEN UPDATE 
    SET [email protected], [email protected], [email protected], [email protected], [email protected]", 
con); 

我的建議是直接在SSMS和端口代碼.NET上玩MERGE語句,因爲發現錯誤更加高效(這是一個複雜且相當醜陋但功能強大的語句)。

在你的情況下,源是明文數據從上下文,這就是爲什麼在源(S)從VALUES,而不是一個tableview形成。

關於MERGE語句的更多有用的提示可參考here

+0

我建議比試圖將'MERGE'語句移植到.NET代碼中更好的做法是將它包裝在存儲過程中,並保存字符串操作的頭疼等。 –

+0

@TomH - 是的,這是一個很好的建議。一個好的選擇是使用實體框架並擺脫手動編寫簡單的查詢:)。在這種情況下,我認爲它會生成一個'SELECT TOP 1 ...',接着是'INSERT'或'UPDATE',所以其性能非常接近MERGE。 – Alexei

相關問題