2016-03-07 85 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

相关问题