4

こんにちは。

SQL クエリについて質問があります。「IN」コマンドを使用して、クエリのパラメータとして配列を使用することは可能ですか?

例えば、

int x = {2,3,4,5}

UPDATE 'table_name' set 'field' = data WHERE field_ID IN (x)

私がこれを尋ねている理由は、データベース内のデータを更新する必要があるときに、反復的な SQL ステートメントを避けるためです。UPDATE クエリに for each ステートメントを使用することも考えましたが、100 件以上のレコードが更新された場合にシステムの速度が低下した場合、クエリのパフォーマンスに影響するかどうかはわかりません。

私はVB.Netを使用しています。私のデータベースは MySQL Workbench です。

4

3 に答える 3

1

変数 (ストアド プロシージャではない) にクエリがあり、大量の ID がない場合は、独自の IN を作成できます。このアプローチの速度はテストしていません。

このコードはコンパイルされません。アイデアを提供するためのものです。

query = "SELECT * FROM table WHERE col IN ("

For t = 0 TO x.Length-1
    If t > 0 Then query &= ","

    query &= "@var" & t
Next

query &= ")"

...

For t = 0 TO x.Length-1
    cmd.Parameters.Add("@var" & t, SqlDbType.Int).Value = x(t)
Next
于 2013-08-27T13:26:42.010 に答える
0

私はmySQLに精通していませんが、MSSQLを扱うときは通常、DBに分割関数があるため、VB側で連結された整数値をテーブルとして分割するために使用できます。

        Dim myIds = {1, 2, 3, 4}
        Dim sql = <sql>                          
                    SELECT m.* FROM dbo.tblMyData m
                    INNER JOIN dbo.fncSplitIntegerValues(@Ids, ',') t ON t.id = m.Id
                  </sql>.Value

        Using con As New SqlConnection("My connection string..."),
            cmd As New SqlCommand(sql, con)

            cmd.Parameters.Add("@Ids", SqlDbType.VarChar).Value =
                myIds.Select(Function(m) m.ToString).Aggregate(Function(m, n) m & "," & n)

            con.Open()

            Dim rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection)
            While rdr.Read()
                Console.WriteLine(rdr.GetValue(0))
                ' do something else...
            End While

        End Using

dbo.fncSplitIntegerValues は、連結された整数 varchar を指定された区切り文字で整数 ID に分割する db 関数です。

単純な sql を使用しないで、代わりに sql パラメーターを使用することが重要です。

注: 上記のサンプルはテストされていません...

于 2013-08-27T07:59:19.367 に答える