我正在编写一个应用程序,如果找不到主键,将插入该应用程序,如果找到则更新。 与此网站上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...
这对我来说并不合适(可能因为它全部在一条线上)。什么是完成这项任务的最佳方式?
答案 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,...')