Параметр VBA ADODB как динамический диапазон Excel

#sql #vba #parameters #adodb

#sql #vba #параметры #adodb

Вопрос:

Я пытаюсь передать список параметров SQL-запросу в VBA, у меня есть таблица Excel со списком кодов в динамическом диапазоне, может быть 2, может быть 2000. Затем я хочу вернуть все данные из SQL, где коды совпадают. Ниже я пытаюсь определить параметр ADODB как массив, затем я хочу передать его в SQL.

Однако определение переменной параметра как диапазона приводит к несоответствию типов. Или объект требуется, если я не определяю как массив;

 Dim conn As New ADODB.Connection
conn.Open "Provider=SQLOLEDB; Data Source=XXXXXXXXX; Initial Catalog=CDB; Integrated Security=SSPI;"
Dim code(0) As ADODB.Parameter
Set code(0) = wb.ActiveSheet.Range(Cells(2, colCode), Cells(rowCount, colCode)).Value
'Dim code As ADODB.Parameter
'Set code = wb.ActiveSheet.Range(Cells(2, colCode), Cells(rowCount, colCode)).Value
'Dim code(rowCount - 1) As ADODB.Parameter
'Set code(rowCount - 1) = wb.ActiveSheet.Range(Cells(2, colCode), Cells(rowCount, colCode)).Value
Set cmd = New ADODB.Command
Set rs = New ADODB.Recordset
With cmd
    .ActiveConnection = conn
    .CommandType = adCmdText
    .Parameters.Append .CreateParameter("@code", adVarChar, adParamInput, 10000, code)
    .CommandTimeout = 0
End With

sql = "SELECT * FROM table WHERE code in (?);"
cmd.CommandText = sql
Set rs = cmd.Execute
 

Комментарии:

1. Вы не можете использовать диапазон (или массив) в качестве параметра, вам нужно будет повторить диапазон и создать разделенную строку (экранированных) значений и использовать ее в предложении IN () .

2. … или создайте параметр для каждого значения в вашем диапазоне (и один ? в вашем sql-операторе)