使用一个查询更新2000条记录

时间:2014-04-25 10:22:40

标签: asp.net sql sql-server entity-framework

我有一个数据库表:

Item

ID (uniqueidentifier)

Index (int)

我有一个2000个键值对项的列表,其中键为ID,值为Index,我需要更新它。如何使用单个SQL查询更新数据库中的所有2000个项目?

现在我有这样的事情:

// this dictionary has 2000 values
Dictionary<Guid, int> values = new Dictionary<Guid,int>(); 
foreach(KeyValuePair<Guid, int> item in values)
{
    _db.Database.ExecuteSqlCommand("UPDATE [Item] SET [Index] = @p0 WHERE [Id] = @p1", item.Value, item.Key);
}

但是,我向SQL Server发出的请求太多了,我想改进它。

2 个答案:

答案 0 :(得分:3)

使用table value parameters将这些值发送到SQL Server并一次更新Items表:

CREATE TYPE KeyValueType AS TABLE 
(
    [Key] GUID,
    [Value] INT
);

CREATE PROCEDURE dbo.usp_UpdateItems
@pairs KeyValueType READONLY
AS
BEGIN
    UPDATE I
    SET [Index] = P.Value
    FROM
        [Item] I
        INNER JOIN @pairs P ON P.Id = I.Id
END;
GO

答案 1 :(得分:0)

如果你确实需要以这种方式进行更新而没有其他选择 - 围绕它的主要方式可能是这样而不是“丑陋”#34;技术(因此很少使用,但仍能很好地运作);

在一个字符串中生成所有2000个语句,并执行该一个字符串。这使得对数据库的一次调用包含2000个更新。

所以基本上是这样的(代码没有实际运行,它是一个例子所以t

Dictionary<Guid, int> values = new Dictionary<Guid, int>();
System.Text.StringBuilder sb = new System.Text.StringBuilder();
foreach (KeyValuePair<Guid, int> item in values)
{
    sb.Append(String.Format("UPDATE [Item] SET [Index] = {0} WHERE [Id] = '{1}';", item.Value, item.Key));

}
_db.Database.ExecuteSqlCommand(sb.ToString);