我需要执行一个简单的查询:
SELECT * FROM MyTable WHERE Id IN (:ids)
显然,它返回给定列表中主键“Id”的记录集。如何将整数 ID 数组传递到参数“ids”的 ADOQuery.Parameters 中?我已经尝试过 VarArray - 它不起作用。如果重要的话,参数“ids”默认情况下 FieldType = ftInteger。
没有可用于将值列表传递给
in
的参数类型。不幸的是,这是参数化 SQL 的缺点之一。
您必须从代码构建查询以生成值列表,或生成参数列表,然后可以从代码填充参数列表。那是因为您可以将每个值作为不同的参数传递,如下所示:
SELECT * FROM MyTable WHERE Id IN (:id1, :id2, :id3)
但是由于列表的大小可能是可变的,因此您必须更改 SQL 来添加参数。在这种情况下,生成值列表同样容易,尽管参数化查询可能会更好地缓存,具体取决于您使用的数据库。
IN 参数仅采用逗号分隔的值字符串,例如 (1,2,3,4,5),所以我假设您将数据类型设置为 ftstring,然后构建字符串并传递...?没有尝试过,但这就是我愿意尝试的......
很久了,但是……也许有人需要它。我是怎么做到的:
procedure TForm1.Button1Click(Sender: TObject);
var
sqlstring, lst : string;
begin
sqlstring:= 'SELECT * FROM MyTable WHERE Id IN (%s)';
lst:= '1,2,3';
Adoquery.sql.clear;
Adoquery.sql.text:= format(sqlstring,[lst]);
AdoQuery.execSQL;
end;