如何使用C#程序中的新值快速更新表中的所有行

时间:2014-11-06 13:50:10

标签: c# sql sql-server

我获得了一张超过20亿行的表格。它有一个输入时间的字段,但表的创建者使该字段成为字符串字段。它也不遵循正常的日期时间约定。

我的任务是创建一个新字段,该字段是一个日期时间类型字段,包含相同的时间但转换为适当的格式,以便可以在其上运行查询。

目前我编写了一个C#控制台应用程序,它选择尚未更新的前100000行,并逐行将字符串转换为时间。然后它会更新每一行。

这个过程有效,但速度慢,时间紧迫。我可以运行我的程序的多个副本,并试图想出一个解决方案,以某种方式运行程序多次,并确保程序的每个副本更新不同的行。

到目前为止的想法:

  • 而不是选择前100000行,选择1000000随机行。 (可能会有一些重叠,但它会完成工作)
  • 这个表有一个id字段。我可以做一个选择,其中id modulo 2 == 0代表一个程序,id%2!= 0代表另一个程序(这可以继续为素数等)。
  • 仅在为我运行的程序的每个副本指定的id范围内获取行
  • 添加一个锁定列,告诉我的程序当前一个字段被锁定(这表示它正在被处理)

任何人都可以提供更好的建议吗?改进我的一个?

感谢。

更新:我现有时间字符串的示例是2014年11月12日:08:52:22,需要转换为2014-11-12 08:42:22

3 个答案:

答案 0 :(得分:2)

使用LINQ to SQL,一次只提取一定数量的记录。

您的代码看起来像这样:

using (var db = new MyDbContext()) 
{
    var results = db.GetResultsFromDatabase();
    int take = 100;
    int processed = 0;

    while(processed < results.Count()) 
    {
        var set = results.Skip(processed).Take(take);
        set.ForEach(s => {  
            // update the date
        }

        processed += take;
    }

    db.SubmitChanges();
}

答案 1 :(得分:1)

只需在SQL中执行此操作,而不是读取整个数据库并进行操作。

使用以下内容:

    UPDATE <TableName>
    SET <dateTime-Date> = CONVERT(datetime, <string-Date>)

检查此网站是否有您想要的任何格式规范: SQL Datetime Conversion

答案 2 :(得分:1)

所以这是我的解决方案,我不知道2mil行的效果如何,以防你想在SQL中使用它。

Declare @string varchar(50) = '12/Nov/2014:08:52:22'
SELECT CONVERT(datetime,REPLACE(SUBSTRING(@string,0,CHARINDEX ( ':' ,@string , 0)),'/',' ')
 +' '+
SUBSTRING(@string,CHARINDEX ( ':' ,@string , 0)+1,LEN(@string)),120)

让我解释一下代码

REPLACE(SUBSTRING(@string,0,CHARINDEX ( ':' ,@string , 0)),'/',' ') 

从日期替换“/”字符并返回2014年11月12日

 SUBSTRING(@string,CHARINDEX ( ':' ,@string , 0)+1,LEN(@string)),120)

从初始字符串中获取日期和时间之间没有“:”的时间。

最后在这两个字符串操作之间添加了一个空格,并将其转换为datetime。

上述查询的输出:'2014-11-12 08:52:22.000'