0

我正在编写一段代码(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()

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

非常感谢!

4

1 回答 1

1

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

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

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

并且您在 SQL 中有一些选项,在replace()caselike(例如)方面可以帮助这个过程。

但是您已经拥有数据库外部的清理代码。为此,您要创建并打开一个游标,处理记录,然后写回。与数据库内操作相比,游标相对较慢。但是,这正是它们的设计目的——将外部代码应用于单个记录。

于 2013-03-02T15:53:21.490 回答