如何在分配参数之后但在打开之前记录SQL.text

nol*_*ker 3 sql delphi

我试图在大型项目中记录SQL调用,而不对代码进行大量更改.为了开始这个过程,我们决定尝试记录执行的DBX查询.

所以我有:

procedure TRService.GetContactInfo(sessionid: String; msrno: Integer);
var
  SQL: String;
  qryContact: TSQLQuery;
  username: String;
begin
  qryContact := TSQLQuery.Create(nil);
  qryContact.SQLConnection := TSQLConnection1;
  qryContact.SQL.Add('select name, address');
  qryContact.SQL.Add('from contact');
  qryContact.SQL.Add('where (msrno = :msrno)');
  qryContact.ParamByName('msrno').AsInteger := msrno;
  {$ifdef LOGSQL}
  SQL := qryContact.???
  LogSQL(SQL);
  // CallNewServer(SQL);
  {$else}
  qryContact.Open;
  {$endif}
end;
Run Code Online (Sandbox Code Playgroud)

结束;

调用LogSQL函数时,我希望它能够记录

'从联系人中选择*(msrno = 12345)'

哪个属性'.???' 我可以使用TSQLQuery来为我提供已经用值替换的参数的SQL字符串吗?理想情况下,我想在此之前执行此操作qryContact.open,因为在将来的版本中,qryContact.open将由对不同服务器的调用替换.

Gol*_*rol 6

这不是那么简单.参数不是简单地在SQL中替换.SQL将与参数值列表一起单独发送到数据库.数据库将以这种或那种方式进行替换.

而且,实际上替换该值对于大多数情况下发生的情况甚至都不正确.大多数数据库在准备具有参数的查询时比使用查询中的常量值更聪明.如果您运行相同的查询两次但具有不同的参数值,它将识别它是相同的查询.然后,数据库可以决定跳过所有类型的准备工作(例如解析SQL并查找执行计划)并重用它为先前执行所执行的缓存工作.

无论如何,长话短说:如果你想这样记录它,你要么必须自己替换值(很难做到正确),要么只记录参数化查询并分别记录参数列表.

我可能会选择后者,不仅因为它更容易,而且因为日志会更清楚地显示哪些值是常量,哪些值是参数,所以它更真实地发生了什么.

  • 我是从sql server的profiler中得到的.不知道如何从Delphi获得 (2认同)