【发布时间】:2018-04-27 14:30:00
【问题描述】:
我正在使用带有 FireDAC 组件的 DELPHI XE6,并且有一个 SQL Server 数据库服务器。
在数据库中,我有一个存储过程,它接受两个参数,一个整数,然后是一个表变量,它只接受一列整数类型。
表变量可以包含从零到多个整数。
程序的负责人:
/*
Declare @Temp dbo.LIP
insert into @Temp
Values(10901), (10902), (10903), (10904), (10905), (10912)
exec [dbo].[sp_lager_PkgList] 19, @Temp
*/
ALTER PROCEDURE [dbo].[sp_lager_PkgList]
@OwnerNo INT,
@LIPVariable dbo.LIP READONLY
AS
BEGIN
注释掉的部分包含我用来检查程序是否正常工作的代码 - 确实如此。
在 Delphi 中我是这样做的:
procedure TForm1.setUpParams;
var
sLIPNo: string;
ii: Integer;
begin
try
spMain.Prepare;
spMain.Params.ParamByName('@OwnerNo').AsInteger := StrToInt(edtPOwner.Text);
with spMain.Params.ParamByName('@LIPVariable') do
begin
DataType := ftDataSet;
DataTypeName := 'dbo.LIP';//'LGlager_PkgList.@LIPVariable';
end;
fdmtblLIPNo.Active := false;
fdmtblLIPNo.Active := True;
fdmtblLIPNo.BeginBatch();
try
for sLIPNo in mmoPLIPs.Lines do
begin
fdmtblLIPNo.Append;
try
fdmtblLIPNo.FieldByName('LIPNo').AsInteger := StrToInt(sLIPNo);
fdmtblLIPNo.Post;
finally
end;
end;
finally
fdmtblLIPNo.EndBatch;
ii := spMain.Params.ParamByName('@OwnerNo').AsInteger;
mmoDebug.Lines.Add(IntToStr(ii));
end;
spMain.ParamByName('@LipVariable').AsDataSet := fdmtblLIPNo;
finally
end;
end;
当我稍后在 delphi 程序中执行此过程时,没有传递任何参数。我已检查该程序是否已执行,以便该部分正常工作。
我做错了什么?我该怎么办?
这是 dbo.LIP 的脚本,它不是直接的火箭科学..
CREATE TYPE [dbo].[LIP] AS TABLE(
[LIPNo] [int] NULL
)
【问题讨论】:
-
旁注:您应该不为您的存储过程使用
sp_前缀。微软有reserved that prefix for its own use (see Naming Stored Procedures),你确实会在未来某个时候冒着名称冲突的风险。 It's also bad for your stored procedure performance。最好只是简单地避免sp_并使用其他东西作为前缀 - 或者根本不使用前缀! -
@marc_s 另一方面,至少我怀疑微软将来会在存储过程名称中使用
lager=) -
@JerryDodge:同意 - 可能性非常小 - 但
sp_也会导致额外的、不必要的过程名称查找,从而减慢速度 - 最好完全避免它! -
谢谢大家,很高兴知道我已经删除了该前缀,但遗憾的是,它并没有改变我的问题。
-
不可能,因为它无关紧要,至少您将参数数据类型设置为
ftObject而不是dtDataSet。那DataTypeName也是错的。
标签: sql-server delphi stored-procedures table-variable