访问SQL中一个字符串中的多个参数值

时间:2014-12-23 13:06:32

标签: sql ms-access access-vba ms-access-2007

我有一个数组,可以有不同数量的值,具体取决于具体情况。我想将这些值作为参数放入ms访问的查询中。

问题是,如果我使用以下代码生成参数,它会将整个字符串作为一个值发送给查询,这显然不会返回任何行。

Do Until i = size + 1
    If Not IsEmpty(gvaruocat(i)) Then
        If Not IsEmpty(DLookup("uo_cat_id", "tbl_uo_cat", "[uo_cat_id] = " & CInt(gvaruocat(i)))) Then
            If IsEmpty(get_uocat_param) Then
                get_uocat_param = CInt(gvaruocat(i))
            Else
                get_uocat_param = get_uocat_param & " OR tbl_uo_step.uo_step_cat = " & CInt(gvaruocat(i))
            End If
        End If
    End If
    i = i + 1
Loop

目前,我通过生成一个SQL字符串并将查询全部保留在一起来“修复”它。

get_uocat = "SELECT tbl_product.prod_descr, tbl_uo_cat.uo_cat_descr, tbl_uo_step.uo_step_descr" & vbCrLf _
          & "FROM (tbl_product INNER JOIN tbl_uo_cat ON tbl_product.prod_id = tbl_uo_cat.uo_cat_prod) INNER JOIN tbl_uo_step ON tbl_uo_cat.uo_cat_id = tbl_uo_step.uo_step_cat" & vbCrLf _
          & "WHERE (((tbl_uo_step.uo_step_cat) = " & get_uocat_param & ")) " & vbCrLf _
          & "ORDER BY tbl_product.prod_descr, tbl_uo_cat.uo_cat_descr, tbl_uo_step.uo_step_descr;"

然而,这对许多变化都不是很友好。所以我的问题是,如何让数组将每个值作为单独的参数发送给查询?

注意: IsEmpty()是一个自定义函数,可以在您想知道的情况下检查空变量。

2 个答案:

答案 0 :(得分:2)

在这种情况下,您仍然可以使用参数化查询,尽管您对该问题发表了评论。您只需要构建SQL字符串以包含所需数量的参数,如下所示:

Dim cdb As DAO.Database, qdf As DAO.QueryDef, rst As DAO.Recordset
Dim sql As String, i As Long

' test data
Dim idArray(1) As Long
idArray(0) = 1
idArray(1) = 3

Set cdb = CurrentDb
sql = "SELECT [LastName] FROM [People] WHERE [ID] IN ("

' add parameters to IN clause
For i = 0 To UBound(idArray)
    sql = sql & "[param" & i & "],"
Next
sql = Left(sql, Len(sql) - 1) ' trim trailing comma
sql = sql & ")"
Debug.Print sql  ' verify SQL statement

Set qdf = cdb.CreateQueryDef("", sql)
For i = 0 To UBound(idArray)
    qdf.Parameters("param" & i).Value = idArray(i)
Next
Set rst = qdf.OpenRecordset(dbOpenSnapshot)

' check results
Do Until rst.EOF
    Debug.Print rst!LastName
    rst.MoveNext
Loop

rst.Close
Set rst = Nothing
Set qdf = Nothing
Set cdb = Nothing

当我在我的测试数据库上运行时,我得到了

SELECT [LastName] FROM [People] WHERE [ID] IN ([param0],[param1])
Thompson
Simpson

答案 1 :(得分:0)

您可以使用IN子句。哪个更好。

Do Until i = size + 1
    If Not IsEmpty(gvaruocat(i)) Then
        If Not IsEmpty(DLookup("uo_cat_id", "tbl_uo_cat", "[uo_cat_id] = " & CInt(gvaruocat(i)))) Then
            If IsEmpty(get_uocat_param) Then
                get_uocat_param = CInt(gvaruocat(i))
            Else
                get_uocat_param = get_uocat_param & ", " & CInt(gvaruocat(i))
            End If
        End If
    End If
    i = i + 1
Loop

然后您的Query构建可以使用,

get_uocat = "SELECT tbl_product.prod_descr, tbl_uo_cat.uo_cat_descr, tbl_uo_step.uo_step_descr" & vbCrLf _
              & "FROM (tbl_product INNER JOIN tbl_uo_cat ON tbl_product.prod_id = tbl_uo_cat.uo_cat_prod) INNER JOIN tbl_uo_step ON tbl_uo_cat.uo_cat_id = tbl_uo_step.uo_step_cat" & vbCrLf _
              & "WHERE ((tbl_uo_step.uo_step_cat IN (" & get_uocat_param & "))) " & vbCrLf _
              & "ORDER BY tbl_product.prod_descr, tbl_uo_cat.uo_cat_descr, tbl_uo_step.uo_step_descr;"