You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Delphi TFDQuery查询首字符为!的SQL Server字段值无匹配问题

Delphi TFDQuery查询!开头字符串无返回结果问题分析

核心成因

  • FireDAC默认开启SQL预处理功能,!是FireDAC预定义的宏变量前缀,你直接将包含!开头的字符串拼接进SQL文本时,TFDQuery的预处理器会将!开头的内容识别为待替换的宏标记,不会作为普通字符串内容发送到SQL Server,最终执行的SQL和你预期不一致,因此匹配不到记录。
  • 直接把拼接后的SQL放到数据库管理工具执行时,没有FireDAC预处理步骤,!会被作为普通字符处理,所以能正常返回结果。

验证方法

你可以在激活查询前打印TFDQuery实际处理后的SQL文本,确认内容是否被修改:

myParameter := '!Tommy';
with qryExec do
begin
 SQL.Clear ;
 SQL.Add('SELECT * FROM myTable T WHERE T.Name='+quotedStr(myParameter));
 // 新增这行查看实际生效的SQL内容
 ShowMessage(SQL.Text);
 active := true ;
 // 后续逻辑
end;

正常情况下你会看到输出的SQL中!Tommy部分已经被预处理器修改,并非你预期的'!Tommy'。

解决方案

方案1:临时关闭当前查询的预处理功能

禁用该查询的宏预处理规则,避免!被特殊识别:

myParameter := '!Tommy';
with qryExec do
begin
  SQL.Clear ;
  // 新增两行配置关闭预处理
  ResourceOptions.MacroCreate := False;
  ResourceOptions.PreprocessCmdText := False;
  SQL.Add('SELECT * FROM myTable T WHERE T.Name='+quotedStr(myParameter));
  active := true ;
  first;
  Result := Not Eof;
end;

方案2(更推荐):使用参数化查询

不要手动拼接SQL字符串,改用FireDAC原生参数绑定,彻底规避转义问题同时避免SQL注入风险:

with qryExec do
begin
  SQL.Clear ;
  // 使用参数占位符
  SQL.Add('SELECT * FROM myTable T WHERE T.Name = :Name');
  // 直接绑定参数值,FireDAC会自动处理所有特殊字符转义
  ParamByName('Name').AsString := '!Tommy';
  active := true ;
  first;
  Result := Not Eof;
end;

内容的提问来源于stack exchange,提问作者larand

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 17:06:03