【发布时间】:2018-03-16 19:41:55
【问题描述】:
我已经阅读了几十篇帖子,其中很多都可以追溯到几年前,但无法想出一种现代、安全和可靠的方法来将数千条记录中的特殊值作为单个查询进行更新。
我遍历表中的所有记录,根据一些特殊逻辑确定一个 DateTime 值,然后运行这个简单的查询来更新该值……超过 3500 次。那是很多次的线路。
UPDATE ScheduleTickets
SET ScheduledStartUTC = @ScheduledStartUTC
WHERE ScheduleId = @ScheduleId AND PatchSessionId = @PatchSessionId
我已经看到 cmets 通过保存和使用 DataTable 来不浪费内存。我见过使用 StringBuilder 动态创建更新查询的解决方案,但感觉不安全/肮脏。当然,整个过程不到一分钟,但一定有更好的方法。
所以,在弄清楚 DateTime 值之后,我调用...
UpdateScheduleTicketStart(ScheduleId, PatchSessionId, scheduledDateTime);
看起来像这样...
private static void UpdateScheduleTicketStart(long scheduleId, long patchSessionId, DateTime scheduledStartUTC)
{
using (SqlConnection c = ConnectVRS())
{
SqlCommand cmd = new SqlCommand(@"
UPDATE ScheduleTickets
SET ScheduledStartUTC = @ScheduledStartUTC
WHERE ScheduleId = @ScheduleId AND PatchSessionId = @PatchSessionId
", c);
cmd.Parameters.Add("@ScheduleId", SqlDbType.BigInt).Value = scheduleId;
cmd.Parameters.Add("@PatchSessionId", SqlDbType.BigInt).Value = patchSessionId;
cmd.Parameters.Add("@ScheduledStartUTC", SqlDbType.VarChar).Value = scheduledStartUTC;
cmd.ExecuteNonQuery();
}
}
如何在一次调用中将所有值传递给 SQL Server,或者如何创建单个 SQL 查询以一举完成更新?
【问题讨论】:
-
循环遍历什么表?
-
可能是表值参数?也许重新思考如何确定要使用的正确值?没有一些细节很难说。
-
我正在阅读这篇文章,因为您不想有一个循环(某处)并为每个插入调用您的方法?您的回答将与 Stackoverlflow 问题有关:stackoverflow.com/questions/20635796/bulk-update-in-c-sharp
-
折衷方案是执行上述代码的操作,只需在单个事务中进行,而不是每次都建立新连接。
-
@MobyDisk 这就是我在问题中提出的问题。我想在单个事务中执行 3500 多条记录的更新。每个都有一个不同的 DateTime 值,但我还需要传递两个值来确定要更新表中的哪一行。这两个值构成一个唯一键。
标签: c# sql .net sql-server sql-server-2016