gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 15:47:32 24 4
gpt4 key购买 nike

我正在尝试记录大型项目中的 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;

结束;

当调用LogSQL函数时,我希望它记录日志

'Select * from contact where (msrno = 12345)'

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

最佳答案

事情没那么简单。这些参数不是简单地在 SQL 中替换的。 SQL 连同参数值列表单独发送到数据库。数据库将以一种或另一种方式进行替换。

此外,实际上替换该值甚至不符合大多数情况下发生的情况。大多数数据库在准备带有参数的查询时比在查询中使用常量值要聪明得多。如果您运行相同的查询两次但使用不同的参数值,它将识别出这是相同的查询。然后,数据库可以决定跳过所有类型的准备工作(例如解析 SQL 和查找执行计划)并重用之前执行时所做的缓存工作。

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

我可能会选择后者,不仅因为它更容易,还因为日志会更清楚地显示哪些值是常量,哪些值是参数,因此更真实地反射(reflect)了实际发生的情况。

关于sql - 如何在分配参数之后、打开之前记录 SQL.text,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53590856/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com