如何解决使用 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 举报,一经查实,本站将立刻删除。