C# 选择每一行,更新它,然后移动到下一行:表中没有主键

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条件,并且我在这个表中没有主键,其他的事情是我必须等待一整晚来处理这

我在这里有一种情况,我受到很多限制,所以请帮助我

我的数据库中有一个250万行的表,没有主键,因为我们将在下一次迭代中清理数据

列的格式是这样的

   [District], [Town Name], [Plant Height]
[Plant Height]
中的数据格式不正确,因此我想遍历所有行,选择
[Plant Height]
单元格值将其转换为某种格式,然后进行更新。我不能使用读取然后更新的方法,因为更新需要一个
where
条件,并且我在这个表中没有主键,其他的事情是我必须等待一整晚来处理这250万条记录,所以这不是一个选项

所以,如果你能建议一些可靠的方法,我可以加载数据,然后逐行更新,我将非常感谢


谢谢

您可以执行以下步骤:

  • 创建一个临时表或非临时表,其结构与表相同,但具有主键(自动递增)

  • 在第1点中创建的表中执行清理,使用主键在记录中移动

  • 将清理后的记录复制回原始表


  • 或者,只有在可以修改原始表的情况下,才能为清理添加主键。

    您可以执行以下步骤:

  • 创建一个临时表或非临时表,其结构与表相同,但具有主键(自动递增)

  • 在第1点中创建的表中执行清理,使用主键在记录中移动

  • 将清理后的记录复制回原始表


  • 或者,只有在可以修改原始表的情况下,才能为清理添加主键。

    表中是否有任何列或一组列的值可用作唯一键?如果是这样,您可以使用该列进行更新。。。如果没有,请告诉我们您对该列的处理方式。在另一种情况下,我认为在这种情况下,建议的带有标识主键的临时表是一个不错的选择。

    表中是否有任何列或一组列的值可以用作唯一键?如果是这样,您可以使用该列进行更新。。。如果没有,请告诉我们您对该列的处理方式。在另一种情况下,我认为在这种情况下,建议的带有标识主键的临时表是一个很好的选择。

    如果您熟悉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