微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 SQL Server 表值参数而不在 SQL Server 上创建类型

如何解决使用 SQL Server 表值参数而不在 SQL Server 上创建类型

我正在尝试在单个参数(表值参数)上传递多个值,并且按照示例可以正常工作

C:\Users\Public\Documents\Embarcadero\Studio\21.0\Samples\Object Pascal\Database\FireDAC\Samples\DBMS Specific\MSsql\TVP

sql

create type TVPType as table(Code integer,Name varchar(100),RegDate datetime,Notes varchar(max))
go

create table TVPTab(Code integer,Notes varchar(max))
go

德尔福:

procedure TForm1.btnQryManualSetupClick(Sender: TObject);
var
  oDS: TFDMemTable;
  i: Integer;
begin
  Start;

  FDQuery2.sql.Text := 'insert into TVPTab (Code,Name,RegDate,Notes) ' +
    'select Code,Notes from :t';
  oDS := TFDMemTable.Create(nil);
  oDS.FieldDefs.Add('Code',ftInteger);
  oDS.FieldDefs.Add('Name',ftString,100);
  oDS.FieldDefs.Add('RegDate',ftTimeStamp);
  oDS.FieldDefs.Add('Notes',ftMemo);
  FDQuery2.Params[0].DataTypeName := 'TVPType';
  FDQuery2.Params[0].AsDataSet := oDS;

  (FDQuery2.Params[0].AsDataSet as TFDMemTable).EmptyDataSet;
  for i := 1 to C_Recs do
    with FDQuery2.Params[0].AsDataSet do begin
      Append;
      Fields[0].AsInteger := i;
      Fields[1].Asstring := 'str' + IntToStr(i * 10);
      Fields[2].AsDateTime := Now() + i;
      Fields[3].Asstring := StringOfChar('x',1000);
      Post;
    end;

  FDConnection1.StartTransaction;
  FDQuery2.Execute;
  FDConnection1.Commit;

  Done('TVP Qry manual setup');
end;

这段代码的问题是它迫使我在服务器上创建一个类型(在本例中为 TVPType 类型),我想使用这些表值参数而不必在服务器上创建任何对象。

能做到吗?我尝试将参数定义为 ftDataset,但出现错误:找不到数据类型 READONLY。

procedure TForm1.btnQryManualSetupClick(Sender: TObject);
var
  oDS: TFDMemTable;
  i: Integer;
begin
  Start;

  FDQuery2.sql.Text := 'insert into TVPTab (Code,ftMemo);
  //FDQuery2.Params[0].DataTypeName := 'TVPType';
  FDQuery2.Params[0].DataType := ftDataset;
  FDQuery2.Params[0].AsDataSet := oDS;

  (FDQuery2.Params[0].AsDataSet as TFDMemTable).EmptyDataSet;
  for i := 1 to C_Recs do
    with FDQuery2.Params[0].AsDataSet do begin
      Append;
      Fields[0].AsInteger := i;
      Fields[1].Asstring := 'str' + IntToStr(i * 10);
      Fields[2].AsDateTime := Now() + i;
      Fields[3].Asstring := StringOfChar('x',1000);
      Post;
    end;

  FDConnection1.StartTransaction;
  FDQuery2.Execute;
  FDConnection1.Commit;

  Done('TVP Qry manual setup');
end;

解决方法

没有。如果您的多个值只是一行,您可以考虑将它们作为逗号分隔的字符串传递,然后使用 STRING_SPLIT 函数,或者使用临时表或永久表来存储多行值。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。