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

SQL Server/Delphi:如何通过表变量类型传递整数列表参数

在Delphi XE6中使用FireDAC调用带表变量参数的SQL Server存储过程

针对你提到的调用sp_lager_PkgList存储过程(接收整数参数和dbo.LIP类型的表变量)的需求,我整理了实际项目中验证过的完整实现方案,直接上干货:

前提确认

首先确保你的SQL Server数据库中已经存在对应的表类型dbo.LIP,它的定义应该是这样的(如果还没创建的话):

CREATE TYPE dbo.LIP AS TABLE (ID INT);

这个类型要和存储过程中使用的表变量类型完全一致,否则会出现参数不匹配的错误。

实现方案一:使用TFDStoredProc组件(推荐)

TFDStoredProc是FireDAC专门用于调用存储过程的组件,参数绑定更直观,代码可读性更高:

procedure CallPkgListProc;
var
  FDStoredProc: TFDStoredProc;
  TableParam: TFDParam;
  TempDS: TDataSet;
begin
  FDStoredProc := TFDStoredProc.Create(nil);
  try
    // 关联已配置好的SQL Server连接组件
    FDStoredProc.Connection := YourFDConnection;
    // 指定存储过程名(务必带上架构名dbo)
    FDStoredProc.StoredProcName := 'dbo.sp_lager_PkgList';

    // 设置第一个整数参数(替换成你存储过程中实际的参数名,比如@WarehouseID)
    FDStoredProc.ParamByName('@参数1名').AsInteger := 19;

    // 配置表变量参数
    TableParam := FDStoredProc.ParamByName('@Temp');
    TableParam.DataType := ftTable;
    TableParam.ParamType := ptInput;
    // 关键:指定SQL Server中定义的表类型名称
    TableParam.MSSQLTypeName := 'dbo.LIP';

    // 向表参数中添加数据
    TempDS := TableParam.AsDataSet;
    TempDS.Open;
    // 可以添加任意数量的整数,传0条数据的话跳过AppendRecord即可
    TempDS.AppendRecord([10901]);
    TempDS.AppendRecord([10902]);
    TempDS.AppendRecord([10903]);
    TempDS.AppendRecord([10904]);
    TempDS.AppendRecord([10905]);
    TempDS.AppendRecord([10912]);

    // 执行存储过程
    FDStoredProc.ExecProc;

    // 如果存储过程有返回结果集,改用Open方法并处理数据集
    // FDStoredProc.Open;
    // while not FDStoredProc.Eof do
    // begin
    //   // 按需处理返回的数据
    //   FDStoredProc.Next;
    // end;
  finally
    FDStoredProc.Free;
  end;
end;

实现方案二:使用TFDCommand组件(适合动态场景)

如果需要动态拼接调用语句,或者更灵活地控制命令内容,可以使用TFDCommand:

procedure CallPkgListWithCommand;
var
  FDCommand: TFDCommand;
  TableParam: TFDParam;
  TempDS: TDataSet;
begin
  FDCommand := TFDCommand.Create(nil);
  try
    FDCommand.Connection := YourFDConnection;
    // 编写调用语句,用参数占位符替代实际参数
    FDCommand.CommandText.Text := 'EXEC dbo.sp_lager_PkgList :MainParam, :TableParam';

    // 绑定整数参数
    FDCommand.ParamByName('MainParam').AsInteger := 19;

    // 配置表参数
    TableParam := FDCommand.ParamByName('TableParam');
    TableParam.DataType := ftTable;
    TableParam.ParamType := ptInput;
    TableParam.MSSQLTypeName := 'dbo.LIP';

    // 添加表数据
    TempDS := TableParam.AsDataSet;
    TempDS.Open;
    TempDS.AppendRecord([10901]);
    // ... 按需添加更多数据

    // 执行命令
    FDCommand.Execute;
  finally
    FDCommand.Free;
  end;
end;

关键注意事项

  • 表类型名称必须完全匹配:MSSQLTypeName必须和SQL Server中创建的表类型名(dbo.LIP)一致,大小写尽量统一避免不必要的问题。
  • 表参数结构匹配:表参数的数据集结构要和dbo.LIP完全一致,这里是单列整数,所以AppendRecord只能传一个整数参数。
  • 空表变量处理:如果需要传0条数据,只需要打开数据集但不添加任何记录即可,不要跳过表参数的配置,否则会触发存储过程的参数缺失错误。
  • FireDAC连接配置:确保你的TFDConnection的DriverID设置为MSSQL,并且服务器地址、数据库名、认证方式等连接参数配置正确,XE6的FireDAC原生支持SQL Server的表值参数,无需额外升级驱动。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:10:01