我有一个数据库表:
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发出的请求太多了,我想改进它。
答案 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);