私は最近vba更新ステートメントに遭遇し、Recordset.Edit
とRecordset.Update
を使用して、既存のデータを編集するだけでなく更新しました。
2つのrecordset.update
ステートメントとUpdate sql Vba
ステートメントの違いを知りたい。私はそれらはすべて同じように機能すると思いますが、どちらがより効率的で、その理由はわかりません。
以下のサンプルコード:
'this is with sql update statement
dim someVar as string, anotherVar as String, cn As New ADODB.Connection
someVar = "someVar"
anotherVar = "anotherVar"
sqlS = "Update tableOfRec set columna = " &_
someVar & ", colunmb = " & anotherVar &_
" where columnc = 20";
cn.Execute stSQL
これはレコードセット用です(更新と編集):
dim thisVar as String, someOthVar as String, rs as recordset
thisVar = "thisVar"
someOthVar = "someOtherVar"
set rs = currentDb.openRecordset("select columna, columnb where columnc = 20")
do While not rs.EOF
rs.Edit
rs!columna = thisVar
rs!columnb = someOthvar
rs.update
rs.MoveNext
loop
WHERE columnc = 20
は、コメントで述べたように1000行以上を選択します。そのUPDATE
ステートメントの実行は、レコードセットをループして行を1つずつ更新するよりも著しく高速です。
後者の戦略は、RBAR(Row By Agonizing Row)アプローチです。単一の(有効な)UPDATE
を実行する最初の戦略は、「セットベース」のアプローチです。一般に、セットベースはパフォーマンスに関してRBARを切り捨てます。
ただし、2つの例では他の問題が発生します。最初の提案は、ADOの代わりにDAOを使用してUPDATE
を実行することです。
CurrentDb.Execute stSQL, dbFailonError
どちらの方法を選択する場合でも、必ずcolumncにインデックスを付けてください。
SQLメソッドは通常、一括更新の場合は最速ですが、構文はしばしば不格好です。
ただし、VBAメソッドには明確な利点があり、コードがよりクリーンであり、データを再要求せずに更新/編集の前または後にレコードセットを使用できます。更新の間に長時間の計算を行わなければならない場合、これは大きな違いを生む可能性があります。また、レコードセットは、ByRefをサポート関数または追加の処理に渡すことができます。
自動番号を使用しているときにシーケンシャルIDを追加するのが現実的ではない、積算合計を追加する、またはレコードセットのいくつかの値に基づいて増分される計算など、テーブルのすべてのレコードを順番に更新する必要がある場合、 DAOメソッドははるかに高速です。
データが処理に必要な順序になっておらず、代わりにデータソースへの値の一致に依存する必要がある場合、SQLの方がはるかに効率的です。