当 TStoredProcedure 的参数方向是 pdOutput 时?

When direction for a parameter of a TStoredProcedure is pdOutput?

我正在使用 Delphi XE8 和 SQL Server 2014。

考虑以下存储过程:

CREATE PROCEDURE [dbo].[usp2_BaseShow_By_Id](
    @ShowId int,
    @Result int OUT
)

我使用这个Delphi代码来枚举它的参数:

function TDBHelper<T>.OpenSingle(ProcedureName:string; Args: TArray<Variant>;
  Transform: TTransformFunc<T>): TDBResult<T>;
var
  Con:TADOConnection;
  Proc:TADOStoredProc;
  ArgIndex,ParamIndex: Integer;
begin
  Result:=TDBResult<T>.Create;
  Con:=GetConnection;
  Proc:=TADOStoredProc.Create(nil);
  try
    try
      Proc.Connection:=Con;
      Proc.ProcedureName:=ProcedureName;
      Proc.Parameters.Clear;
      Proc.Parameters.Refresh;
      ArgIndex:=0;
      for ParamIndex := 0 to Proc.Parameters.Count-1 do begin
        if(Proc.Parameters[ParamIndex].Direction in [pdInput,pdInputOutput])then begin
          Proc.Parameters[ParamIndex].Value:=Args[ArgIndex];
          Inc(ArgIndex);
        end;
      end;
      Proc.Open;
      Result.Data:=Transform(Proc);
      Result.Success:=True;
      Proc.Close;
      Con.Close;
    except
      on E:Exception do begin
        Result.Success:=False;
        Result.E:=E;
      end;
    end;
  finally
    Proc.Free;
    Con.Free;
  end;
end;

这告诉我参数有以下parameter direction:

  1. pdReturnValue为存储过程的结果。
  2. pdInput为存储过程的第一个参数。
  3. pdInputOutput为存储过程的第二个参数。

我对上面列表中的第 3 项感到惊讶。我本以为 pdOutput。问题:

Why is this parameter pdInputOutput rather than pdOutput?

因为尽管有OUT关键字,参数还是用于输入和输出。请尝试以下操作:

CREATE PROC DoubleIt (@Value int OUT)
AS
SET @Value = @Value * 2
GO

DECLARE @Val int = 3
exec DoubleIt @Val OUTPUT
PRINT @Val

您会注意到 @Value 同时用作输入和输出。

In what circumstances would a parameter be deemed to be pdOutput?

您可以手动创建参数。不幸的是,我目前无法轻易测试它。还有可能有其他数据库平台支持它。

What should I do in my stored procedure in SQL Server to have a pdOutput parameter in Delphi?

我认为您在 SQL 服务器中无能为力。我不知道有什么方法可以将参数定义为 output-only.