Как уже говорили другие, вероятно, лучше использовать параметры в первую очередь. Однако ...
Я тоже пропустил оператор конкатенации, привыкший к. = В PHP. В некоторых случаях я написал для этого функцию, хотя и не относящуюся к конкатенации строк SQL. Вот код, который я использую для создания строки запроса для HTTP GET:
Public Sub AppendQueryString(strInput As String, _
ByVal strAppend As String, Optional ByVal strOperator As String = "&")
strAppend = StringReplace(strAppend, "&", "&")
strInput = strInput & strOperator & strAppend
End Sub
И пример, где я это назвал:
AppendQueryString strOutput, "InventoryID=" & frm!InventoryID, vbNullstring
AppendQueryString strOutput, "Author=" & URLEncode(frm!Author)
... и пр.
Теперь, для конструирования предложений SQL WHERE, вы можете рассматривать что-то подобное как обертку вокруг Application.BuildCriteria:
Public Sub ConcatenateWhere(ByRef strWhere As String, _
strField As String, intDataType As Integer, ByVal varValue As Variant)
If Len(strWhere) > 0 Then
strWhere = strWhere & " AND "
End If
strWhere = strWhere & Application.BuildCriteria(strField, _
intDataType, varValue)
End Sub
Тогда вы бы назвали это:
Dim strWhere As String
ConcatenateWhere strWhere,"tblInventory.InventoryID", dbLong, 10036
ConcatenateWhere strWhere,"tblInventory.OtherAuthors", dbText, "*Einstein*"
Debug.Print strWhere
strSQL = "SELECT tblInventory.* FROM tblInventory"
strSQL = strSQL & " WHERE " & strWhere
... и Debug.Print выведет эту строку:
tblInventory.InventoryID=10036 AND tblInventory.OtherAuthors Like "*Einstein*"
Вариации этого могут быть более полезными для вас, т. Е. Вы можете захотеть иметь необязательный оператор конкатенации (чтобы вы могли иметь ИЛИ), но я бы, вероятно, сделал это путем создания последовательности строк WHERE и конкатенации их с помощью ИЛИ строка за строкой в коде, так как вы, вероятно, захотите аккуратно поместить скобки, чтобы убедиться, что приоритет AND / OR выполнен правильно.
Теперь, ничего из этого не касается объединения значений VALUES для оператора INSERT, но я спрашиваю, как часто вы фактически вставляете литеральные значения в приложение Access. Если вы не используете несвязанную форму для вставки записей, вы будете использовать форму для вставки записей, и, следовательно, вообще не использовать оператор SQL. Таким образом, для предложений VALUES кажется, что в приложении Access вам не нужно это очень часто. Если вы обнаружите, что вам нужно написать такие предложения VALUES, как это, я бы посоветовал вам неправильно использовать Access.
Тем не менее, вы можете использовать что-то вроде этого:
Public Sub ConcatenateValues(ByRef strValues As String, _
intDatatype As Integer, varValue As Variant)
Dim strValue As String
If Len(strValues) > 0 Then
strValues = strValues & ", "
End If
Select Case intDatatype
Case dbChar, dbMemo, dbText
' you might want to change this to escape internal double/single quotes
strValue = Chr(34) & varValue & Chr(34)
Case dbDate, dbTime
strValue = "#" & varValue & "#"
Case dbGUID
' this is only a guess
strValues = Chr(34) & StringFromGUID(varValue) & Chr(34)
Case dbBinary, dbLongBinary, dbVarBinary
' numeric?
Case dbTimeStamp
' text? numeric?
Case Else
' dbBigInt , dbBoolean, dbByte, dbCurrency, dbDecimal,
' dbDouble, dbFloat, dbInteger, dbLong, dbNumeric, dbSingle
strValue = varValue
End Select
strValues = strValues & strValue
End Sub
... который объединит ваш список значений, а затем вы сможете объединить всю строку SQL (между символами предложения VALUES ()).
Но, как говорили другие, в первую очередь лучше использовать параметры.