C# 选择每一行,更新它,然后移动到下一行:表中没有主键
我在这里有一种情况,我受到很多限制,所以请帮助我 我的数据库中有一个250万行的表,没有主键,因为我们将在下一次迭代中清理数据 列的格式是这样的C# 选择每一行,更新它,然后移动到下一行:表中没有主键,c#,asp.net,sql,sql-server,sql-server-2008-r2,C#,Asp.net,Sql,Sql Server,Sql Server 2008 R2,我在这里有一种情况,我受到很多限制,所以请帮助我 我的数据库中有一个250万行的表,没有主键,因为我们将在下一次迭代中清理数据 列的格式是这样的 [District], [Town Name], [Plant Height] [Plant Height]中的数据格式不正确,因此我想遍历所有行,选择[Plant Height]单元格值将其转换为某种格式,然后进行更新。我不能使用读取然后更新的方法,因为更新需要一个where条件,并且我在这个表中没有主键,其他的事情是我必须等待一整晚来处理这
[District], [Town Name], [Plant Height]
[Plant Height]
中的数据格式不正确,因此我想遍历所有行,选择[Plant Height]
单元格值将其转换为某种格式,然后进行更新。我不能使用读取然后更新的方法,因为更新需要一个where
条件,并且我在这个表中没有主键,其他的事情是我必须等待一整晚来处理这250万条记录,所以这不是一个选项
所以,如果你能建议一些可靠的方法,我可以加载数据,然后逐行更新,我将非常感谢
谢谢您可以执行以下步骤:
或者,只有在可以修改原始表的情况下,才能为清理添加主键。您可以执行以下步骤:
或者,只有在可以修改原始表的情况下,才能为清理添加主键。表中是否有任何列或一组列的值可用作唯一键?如果是这样,您可以使用该列进行更新。。。如果没有,请告诉我们您对该列的处理方式。在另一种情况下,我认为在这种情况下,建议的带有标识主键的临时表是一个不错的选择。表中是否有任何列或一组列的值可以用作唯一键?如果是这样,您可以使用该列进行更新。。。如果没有,请告诉我们您对该列的处理方式。在另一种情况下,我认为在这种情况下,建议的带有标识主键的临时表是一个很好的选择。如果您熟悉LINQ to实体和实体框架,可以创建一个简单的控制台应用程序来实现这一点。从数据库/表创建实体数据模型。然后,您需要创建一个循环来进行转换,并在每次传递时推进一个变量,如下所示。orderby用于简化Skip/Take方法,该方法将处理分块为10000条记录/周期:
class Program
{
static void Main(string[] args)
{
int i = 0;
i = QueryRecords(i);
}
private static int QueryRecords(int i)
{
using (YourEntityModel db = new YourEntityModel())
{
var query = (from p in db.Plants
select p).OrderBy(x => x.TownName).Skip(i).Take(10000);
if (query.Count() >= 1)
{
ProcessRecords(i, query);
}
else
{
Console.WriteLine("Reached end of records");
Console.ReadLine();
}
}
return i;
}
private static void ProcessRecords(int i, IQueryable<Plants> query)
{
foreach (Plants item in query)
{
//Do your transform
// item.PlantHeight = PlantHeight **converted to inches**
//db.SaveChanges();
}
i = i + 10000;
QueryRecords(i);
}
}
类程序
{
静态void Main(字符串[]参数)
{
int i=0;
i=查询记录(i);
}
私有静态int查询记录(int i)
{
使用(YourEntityModel db=new YourEntityModel())
{
var query=(从数据库中的p开始)
选择p).OrderBy(x=>x.towname).Skip(i).Take(10000);
如果(query.Count()>=1)
{
过程记录(i,查询);
}
其他的
{
Console.WriteLine(“到达记录末尾”);
Console.ReadLine();
}
}
返回i;
}
私有静态void ProcessRecords(inti,IQueryable查询)
{
foreach(查询中的工厂项目)
{
//做你的转变
//item.PlantHeight=植物高度**转换为英寸**
//db.SaveChanges();
}
i=i+10000;
查询记录(一);
}
}
如果您熟悉LINQ to Entities和Entity Framework,您可以创建一个简单的控制台应用程序来实现这一点。从数据库/表创建实体数据模型。然后,您需要创建一个循环来进行转换,并在每次传递时推进一个变量,如下所示。orderby用于简化Skip/Take方法,该方法将处理分块为10000条记录/周期:
class Program
{
static void Main(string[] args)
{
int i = 0;
i = QueryRecords(i);
}
private static int QueryRecords(int i)
{
using (YourEntityModel db = new YourEntityModel())
{
var query = (from p in db.Plants
select p).OrderBy(x => x.TownName).Skip(i).Take(10000);
if (query.Count() >= 1)
{
ProcessRecords(i, query);
}
else
{
Console.WriteLine("Reached end of records");
Console.ReadLine();
}
}
return i;
}
private static void ProcessRecords(int i, IQueryable<Plants> query)
{
foreach (Plants item in query)
{
//Do your transform
// item.PlantHeight = PlantHeight **converted to inches**
//db.SaveChanges();
}
i = i + 10000;
QueryRecords(i);
}
}
类程序
{
静态void Main(字符串[]参数)
{
int i=0;
i=查询记录(i);
}
私有静态int查询记录(int i)
{
使用(YourEntityModel db=new YourEntityModel())
{
var query=(从数据库中的p开始)
选择p).OrderBy(x=>x.towname).Skip(i).Take(10000);
如果(query.Count()>=1)
{
过程记录(i,查询);
}
其他的
{
Console.WriteLine(“到达记录末尾”);
Console.ReadLine();
}
}
返回i;
}
私有静态void ProcessRecords(inti,IQueryable查询)
{
foreach(查询中的工厂项目)
{
//做你的转变
//item.PlantHeight=植物高度**转换为英寸**
//db.SaveChanges();
}
i=i+10000;
查询记录(一);
}
}
您可以使用UPDATE
和CASE
对一列应用转换,而不需要WHERE
子句
检查[PlantHeight]
列的格式,然后应用所需的转换,例如:
UPDATE myTableName
SET [PlantHeight] =
CASE
WHEN [PlantHeight] = <condition> THEN <apply transform cm to inches>
WHEN [PlantHeight] = <condition> THEN <apply transform m to inches>
END
更新myTableName
设置[植物高度]=
案例
当[植物高度]=然后
当[植物高度]=然后
结束
您可以使用UPDATE
和CASE
在一列上应用转换,而不需要WHERE