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

如何在Delphi中通过ADO/FireDAC获取SQL Server存储过程T-SQL?

嘿,我来给你梳理下在Delphi里用FireDAC或ADO获取SQL Server存储过程T-SQL语句的具体方向——其实核心思路都是直接查询SQL Server的系统视图,因为存储过程的定义文本本来就存在系统表里,不管用FireDAC还是ADO都能实现~

用FireDAC实现的步骤
  • 确保你的FDConnection已经正确连接到目标SQL Server数据库
  • 使用FDQuery组件执行查询系统视图的SQL语句,SQL Server中存储过程的定义存放在sys.sql_modules和sys.objects视图中,关联查询就能拿到完整信息:
SELECT o.name AS ProcedureName, m.definition AS ProcedureTSQL
FROM sys.objects o
INNER JOIN sys.sql_modules m ON o.object_id = m.object_id
WHERE o.type = 'P' -- 'P'是SQL Server中存储过程的类型标识
ORDER BY o.name
  • 遍历查询结果集,提取每个存储过程对应的T-SQL语句,示例Delphi代码:
procedure TForm1.GetProcTSQLWithFireDAC;
var
  I: Integer;
begin
  FDQuery1.SQL.Clear;
  FDQuery1.SQL.Add('SELECT o.name AS ProcedureName, m.definition AS ProcedureTSQL');
  FDQuery1.SQL.Add('FROM sys.objects o');
  FDQuery1.SQL.Add('INNER JOIN sys.sql_modules m ON o.object_id = m.object_id');
  FDQuery1.SQL.Add('WHERE o.type = ''P''');
  FDQuery1.SQL.Add('ORDER BY o.name');
  FDQuery1.Open;

  // 遍历结果并输出到Memo(你可以换成自己的展示逻辑)
  for I := 0 to FDQuery1.RecordCount - 1 do
  begin
    Memo1.Lines.Add('存储过程名称: ' + FDQuery1.FieldByName('ProcedureName').AsString);
    Memo1.Lines.Add('T-SQL定义:');
    Memo1.Lines.Add(FDQuery1.FieldByName('ProcedureTSQL').AsString);
    Memo1.Lines.Add('----------------------------');
    FDQuery1.Next;
  end;

  FDQuery1.Close;
end;
  • 注意:如果存储过程创建时使用了WITH ENCRYPTION参数加密,m.definition会返回NULL,这种情况无法获取到T-SQL定义,这是SQL Server的原生限制。
用ADO实现的步骤

ADO的实现逻辑和FireDAC几乎一致,只是换用ADO系列组件:

  • 确保ADOConnection已成功连接到SQL Server数据库
  • 使用ADOQuery执行同样的系统视图查询SQL(SQL语句和FireDAC部分完全相同)
  • 遍历结果集提取T-SQL语句,示例Delphi代码:
procedure TForm1.GetProcTSQLWithADO;
var
  I: Integer;
begin
  ADOQuery1.SQL.Clear;
  ADOQuery1.SQL.Add('SELECT o.name AS ProcedureName, m.definition AS ProcedureTSQL');
  ADOQuery1.SQL.Add('FROM sys.objects o');
  ADOQuery1.SQL.Add('INNER JOIN sys.sql_modules m ON o.object_id = m.object_id');
  ADOQuery1.SQL.Add('WHERE o.type = ''P''');
  ADOQuery1.SQL.Add('ORDER BY o.name');
  ADOQuery1.Open;

  // 遍历结果并输出到Memo
  for I := 0 to ADOQuery1.RecordCount - 1 do
  begin
    Memo1.Lines.Add('存储过程名称: ' + ADOQuery1.FieldByName('ProcedureName').AsString);
    Memo1.Lines.Add('T-SQL定义:');
    Memo1.Lines.Add(ADOQuery1.FieldByName('ProcedureTSQL').AsString);
    Memo1.Lines.Add('----------------------------');
    ADOQuery1.Next;
  end;

  ADOQuery1.Close;
end;
  • 同样要注意加密存储过程的限制,这种情况无法获取定义。

如果只想获取单个指定存储过程的T-SQL,只需要在WHERE子句中添加AND o.name = ''你的存储过程名''即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:00:24