大家下午好,
我对SQL查询有疑问。是否可以使用“IN”命令将数组用作查询的参数?
例如,
int x = {2,3,4,5}
UPDATE'table_name'set'field'= data WHERE field_ID IN(x)
我要问的原因是当我必须更新数据库中的数据时,避免使用迭代SQL语句。 我还想过为UPDATE Query中的每个语句使用一个但是我不知道它是否会影响查询的性能,如果更新了100多条记录会降低系统的速度。我正在使用VB.Net btw。 我的数据库是MySQL Workbench。
答案 0 :(得分: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
答案 1 :(得分:0)
我不熟悉mySQL,但在处理MSSQL时,我通常在DB中有一个split函数,这样我就可以用它来将连接的整数值拆分为一个表,在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是一个db函数,用于将连接的整数varchar拆分为具有给定分隔符的整数Id。
重要的是不要使用普通的sql,而是使用sql参数。
注意:以上样本未经过测试......
答案 2 :(得分:0)
我已经得到了答案。我只需要将每个元素转换为String,然后将其与每个元素的“,”连接起来。所以我将传递的参数将是一个字符串。
解答: int x = {2,3,4,5} 会变成 string x =“2,3,4,5”
我的查询字符串将变为“UPDATE tablename SET field = value WHERE ID IN(”&amp; x&amp;“)”
感谢所有帮助过的人。