我正在使用SQL Server来管理网站的数据。我刚刚决定向数据库添加两个新列,我想为表中的每一行填充这两列。要填充每个列,我使用另一个表中的信息。我已经创建了一个在C#中为我做的方法,但它需要很长时间。它大约35,000行。这是我的C#方法所做的,但我想知道将它作为存储过程是否更好,如果它更好,我怎么能去做呢?
public void UpdateAssignedCountAndLastReponseDate()
{
//Loop through each task in the database
foreach (var task in IssueDb.AP_Tasks.ToList())
{
// Check to see if there is both not a null and a last response date
if (task.AssignedCount != null && task.LastReponseDate != null) continue;
//Check the task history for records
var taskhistory = from x in IssueDb.AP_TaskHistory
where x.TaskID == task.TaskID && x.AssignDate != null
select x;
//get last response date
var maxAssignDate = (from th in IssueDb.AP_TaskHistory where task.TaskID == th.TaskID orderby th.AssignDate descending select th.AssignDate).FirstOrDefault();
IssueDb.Entry(task).State = EntityState.Modified;
task.LastReponseDate = maxAssignDate;
//get count
task.AssignedCount = taskhistory.Count();
if (task.LastReponseDate == null)
task.LastReponseDate = task.TaskDate;
if (task.AssignedCount == null)
task.AssignedCount = 0;
//save these numbers to task columns in the DB
IssueDb.SaveChanges();
}
}
我目前在ASP的EF5中这样做。 NET应用程序MVC
这是我到目前为止所做的:
UPDATE [dbo].[AP_Tasks]
SET [AssignedCount] =
(
CASE [AssignedCount] IS NULL THEN (SELECT *, COUNT(*) FROM [dbo].[AP_TaskHistory] INNER JOIN [AP_TaskHistory] WHERE [AP_TaskHistory].[TaskID] == [AP_Tasks].[TaskID] AND [AP_TaskHistory].[AssignDate] IS NOT NULL)
);
SET [LastReponseDate] =
(
CASE [AP_Tasks].[LastReponseDate] IS NULL
THEN (SELECT FIRST(AssignDate) FROM [dbo].[AP_TaskHistory] INNER JOIN [AP_TaskHistory] WHERE [AP_TaskHistory].[TaskID] == [AP_Tasks].[TaskID] AND [AP_TaskHistory].[AssignDate] IS NOT NULL ORDER BY [AP_TaskHistory].[AssignDate] DESC)
);
以下是我的错误:
Msg 156, Level 15, State 1, Line 5
Incorrect syntax near the keyword 'IS'.
Msg 156, Level 15, State 1, Line 5
Incorrect syntax near the keyword 'WHERE'.
Msg 195, Level 15, State 10, Line 11
'FIRST' is not a recognized built-in function name.
答案 0 :(得分:2)
在SQL Server中,您可以执行连接其他表的更新语句。这是一个例子
UPDATE u
SET u.FirstName = t2.SomeColumn
FROM Users u
INNER JOIN Table2 t2 ON (u.UserID = t2.UserID)
由于您使用的是EF,因此您可以将其放入迁移脚本中。
这种方法会快得多!
答案 1 :(得分:1)
我拿了你的更新声明并清理了它:
UPDATE [dbo].[AP_Tasks]
SET [AssignedCount] = ( SELECT COUNT(*)
FROM [dbo].[AP_TaskHistory]
WHERE [AP_TaskHistory].[TaskID] = [AP_Tasks].[TaskID] AND [AP_TaskHistory].[AssignDate] IS NOT NULL
) ,
[LastReponseDate] = ( SELECT MAX(AssignDate)
FROM [dbo].[AP_TaskHistory]
WHERE [AP_TaskHistory].[TaskID] = [AP_Tasks].[TaskID] AND [AP_TaskHistory].[AssignDate] IS NOT NULL
)
答案 2 :(得分:-1)
当然,使用存储过程会更快。
您的存储过程的代码看起来与您的C#代码非常相似,您可以使用while,if / else语句,...