阅读时更新表格

时间:2013-03-02 15:36:30

标签: sql vb.net

我正在编写一段代码(VB.NET)来清理(非常大的)数据表。

我正在连接到我的SQL数据库,循环遍历表,清理数据并在另一列中添加已清理的数据。

由于我正在为我清理数据的同一循环中的每条记录更新我的数据库,我想知道是否有更有效的方法来执行此操作,我将清理数据和然后一次性将所有更新的记录发送到数据库。

简化代码:

'Connect
SQLConn.ConnectionString = strConnection
SQLConn.Open()
SQLCmd.Connection = SQLConn
SQLConn2.ConnectionString = strConnection
SQLConn2.Open()
SQLCmd2.Connection = SQLConn2

'Set query
strSQL = "SELECT Column1 FROM Table1"
SQLCmd.CommandText = strSQL

'Load Query
SQLdr = SQLCmd.ExecuteReader

'Start Cleansing
While SQLdr.Read
    Cleansing()

'Add to database
    strSQL2 = "UPDATE Table1 SET Clean_data = '" & strClean & "' WHERE Dirty_Data = '" & SQLdr(0).ToString & "'"
    SQLCmd2.CommandText = strSQL2
    SQLCmd2.ExecuteNonQuery() 
End While

'Close Connections
SQLdr.Close()
SQLConn.Close()
SQLConn2.Close()

我猜测(从搜索解决方案)可以在我的循环之外进行更新,但我似乎无法找到具体的方法。

非常感谢!

1 个答案:

答案 0 :(得分:1)

您的代码需要很长时间,因为update正在为每条记录执行全表扫描。您可以通过在“脏数据”列上添加索引来加快速度。

基本上,您正在读取select语句中的数据。清理一行,然后更新它。首选的“基于集合”的方法更像是: 理想情况下,您希望这样做:

update table1
    set column1 = <fix the dirty data>
    where column1 <is dirty>

您可以在SQL中使用replace()case以及like(例如)来帮助完成此过程。

但是您已经拥有数据库外部的清洁代码。为此,您需要创建并打开游标,处理记录,然后回写。与数据库内操作相比,游标相对较慢。但是,这完全他们设计的情况 - 外部代码应用于单个记录。