如果存在则更新,否则插入

时间:2014-04-18 18:02:16

标签: sql vb.net

我正在编写一个应用程序,如果找不到主键,将插入该应用程序,如果找到则更新。 与此网站上here提出的情况类似。

问题。

现在我使用以下代码进行插入。 (名称已更改,但格式相同)

 Using con As New SqlConnection
            Using cmd As New SqlCommand
                Try
                    con.ConnectionString = "removed"
                    con.Open()
                    cmd.Connection = con
                    cmd.CommandText = "INSERT INTO [table] ([primary key],[value]) VALUES (@primary key, @value)"
                    cmd.Parameters.AddWithValue("@primary key", code to grab key)
                    cmd.Parameters.AddWithValue("@value", code for value)
                    cmd.ExecuteNonQuery()
                    con.Close()
                Catch ex As Exception
                    MessageBox.Show("Error while inserting record on table..." & ex.Message, "Insert Records")
                End Try
            End Using
        End Using

上面的完整代码适合我。 但现在我需要它才能找到主键的插入内容。

基于以上链接,是做这样的事情的答案

  cmd.CommandText = "Merge Table as target using (values ('key') as source(key) on taget.idfield = code for key...

这对我来说并不合适(可能因为它全部在一条线上)。什么是完成这项任务的最佳方式?

2 个答案:

答案 0 :(得分:2)

Merge绝对是完成此任务的好方法。您的代码应该与此类似:

cmd.CommandText = 
@"
    Merge into Table as Target 
    Using (Select @PrimaryKey As PrimaryKey) As Source
        On Target.PrimaryKey = Source.PrimaryKey
    When not matched then
        Insert (PrimaryKey, Value)
        Values (@PrimaryKey, @Value)
    When matched then 
        Update 
        Set Value = @Value
    ;
";

答案 1 :(得分:1)

选择和插入/更新需要2次访问数据库。

所以这里只有一个:

MERGE INTO yourTable target
USING (select val1 as key1, val2 as key2... from dual) source
ON (target.primary_key = source.key1)
WHEN MATCHED THEN UPDATE SET target.column2 = source.key2....
WHEN NOT MATCHED THEN INSERT (target.primary_key, target.column2, ...)
VALUES(source.key1, source.key2, ...)    

我正在使用oracle语法将您的传入参数转换为数据集, 在其他数据库上它将是不同的(SQL Server,例如:'select val1 as key1,...')