Parametry nie działają w ten sposób; nie mają pojęcia, że to, co próbujesz podać, jest listą wartości oddzielonych przecinkami. Jeśli ustawisz ParamByName('WhatEver').AsString lub Value , myśli, że masz na myśli ciąg w cudzysłowie, który zawiera wszystko, co należy do tego parametru. Robi dokładnie to, na co wygląda — przekazuje IN ('1, 2, 3') , zamiast zamierzonego IN (1, 2, 3) .
Musisz albo wrócić do samodzielnego analizowania i używania tabeli tymczasowej, albo zbudować WHERE klauzulę dynamicznie i łącząc ją przed wykonaniem zapytania. (Właściwie możesz zbudować zapytanie dynamicznie, tworząc nowy parametr dla każdego elementu w IN klauzuli, a następnie przejdź przez pętlę i przypisz wartości do każdego z tych dynamicznie tworzonych parametrów, ale to bardzo szybko staje się bardzo brzydkie.)