SQL принимает только одиночные значения в качестве параметров, поэтому вы не можете создать оператор с одним параметром, который может отображать переменное число значений, например, приведенный вами пример.
Однако вы все равно можете использовать параметризованные SQL в этой ситуации. Решение состоит в том, чтобы перебирать список значений, которые у вас есть, добавив маркер параметра в SQL и параметр в список параметров для каждого значения.
Это проще всего сделать с позиционными, а не с именованными параметрами, но могут быть адаптированы и для именованных параметров (вам может понадобиться отрегулировать этот код, так как я не имею Delphi и не помню синтаксис создания параметра):
//AValues is an array of variant values
//SQLCommand is some TDataSet component with Parameters.
for I := Low(AValues) to High(AValues) do
begin
if ParamString = '' then
ParamString = '?'
else
ParamString = ParamString + ', ?';
SQLCommand.Parameters.Add(AValues[I]);
end
SQLCommand.CommandText =
'SELECT * FROM MyTable WHERE KeyValue IN (' + ParamString + ')';
Это приведет к инъекции - безопасный параметризованный запрос.