1

ええと...私はn00bです、私はそれを知っています。そして、これはかなり簡単です。

基本的に、これは私が書いてきたコードです。

rstSwift.MoveFirst
Do While Not rstSwift.EOF
    If Left(rstSwift!Date, 2) & Mid(rstSwift!Date, 4, 2) & Right(rstSwift!Date, 4) = fromdate Then
        INSERTFUNCTIONHERE
    Else
    End If
    rstSwift.MoveNext
Loop

私は最近 SQL について質問しましたが、私の問題に対する多くの解決策があるようです...ほら、私の現在のデータベースには約 +15000 のエントリがあります。 1 日でしばらく時間がかかります。結局のところ、データベース全体で LOOP を実行するように求めているのです。

さて、そうするのは少しばかげているかもしれないことに気づきました-まあ、それが私がそれを行うことができる唯一の方法でした-私の主な質問は次のとおりです。

SQL クエリを「do while not」に置き換えることはできますか? お気に入り

NEWTABLEVARIABLE = SELECT * from rstSwift WHERE rstSwift.Date = '20/11/2011';
NEWTABLEVARIABLE.MoveFirst
Do While Not NEWTABLEVARIABLE.EOF
INSERTFUNCTIONHERE
NEWTABLEVARIABLE.MoveNext
Loop

このクエリの結果に対して、コードを実行しますか? 現在のコードよりも高速でしょうか? 速くなくても、遅いですか?Whileループの状況に対処するよりも、その単一の選択引数を書く方がはるかに簡単に思えるからです...

4

2 に答える 2

3

目的は、ループを完全に削除することです。

次の代わりにINSERTFUNCTIONHERE、列を 1 ずつインクリメントするとします。data_col

rstSwift.MoveFirst
Do While Not rstSwift.EOF
    If Left(rstSwift!swift_date, 2) & _
          Mid(rstSwift!swift_date, 4, 2) & _
          Right(rstSwift!swift_date, 4) = fromdate Then
        rstSwift!data_col = rstSwift!data_col + 1
        rstSwift.Update
    End If
    rstSwift.MoveNext
Loop

代わりに、操作全体を SQL で書き直します。

CREATE PROCEDURE IncrementSwifts
(
 :fromdate DATETIME
)
AS
UPDATE Swifts
   SET data_col = data_col + 1
 WHERE swift_date = :fromdate;

次に、VBA で Command オブジェクトを使用して proc を実行し、Parameter オブジェクトを使用してfromdate値を渡します。

于 2011-11-30T09:36:44.997 に答える
2

はい、データベース側でフィルタリングを行うことができます。レコードセットを開くときに、で指定したクエリを渡します。このようなもの:

set rstSwift = connMyDbConnection.Execute("SELECT * from rstSwift WHERE rstSwift.Date = #20/11/2011#")
Do While Not rstSwift.EOF
   INSERTFUNCTIONHERE
   rstSwift.MoveNext
Loop

編集:
Database.OpenRecordset() メソッドを使用する場合、上記の代わりに次の構文を使用します。

set rstSwift = mdb.OpenRecordset("SELECT * from rstSwift WHERE rstSwift.Date = #20/11/2011#")
Do While Not rstSwift.EOF
   INSERTFUNCTIONHERE
   rstSwift.MoveNext
Loop

フィルターに一致するレコードの数によっては、現在使用しているよりも高速になる可能性があります。

注意:
私が提供する例は、何らかの入力に基づいて動的に作成されるようにクエリを変更すると、SQL インジェクション攻撃を受けやすくなる可能性があります。SQL を実行する前に、常に SQL をクレンジングしていることを確認してください。

于 2011-11-29T18:12:27.500 に答える