Delphi - 将表值参数传递给SQL Server存储过程

时间:2014-06-12 08:59:36

标签: sql sql-server delphi stored-procedures

我需要将参数作为SQL Server中存储过程的表值传递。如何在Delphi中处理这个?

2 个答案:

答案 0 :(得分:5)

据我所知,没有简单的方法来传递Table参数,使用Delphi附带的组件。 解决方法是使用临时表,该表可用于填充类型化的表变量。

假设您的定义如下:

CREATE TYPE MyTableType AS TABLE 
( ID int
, Text varchar(100) )
GO

CREATE PROCEDURE P_Table 
    @Tab MyTableType READONLY
AS
BEGIN
    SET NOCOUNT ON;
    Select * from @Tab -- dummy operation just return the dataset
END
GO

你可以这样调用这个程序:

var
  i: Integer;
begin
  // we create a temporary table since a table variable can obly be used for a single call
  DummyDataset.Connection.Execute('Create Table #mytemp(ID int,Text varchar(100))');
  DummyDataset.CommandText := 'Select * from #mytemp';
  DummyDataset.Open;
  for i := 0 to 10 do
  begin
    DummyDataset.Append;
    DummyDataset.Fields[0].Value := i;
    DummyDataset.Fields[1].Value := Format('A Text %d', [i]);
    DummyDataset.Post;
  end;
  MyDataset.CommandText := 'Declare @mytemp as MyTableType '
                         + 'Insert into @mytemp select * from #mytemp '  // copy data to typed table variable
                         + 'EXEC P_Table @Tab = @mytemp';
  MyDataset.Open;
  DummyDataset.Connection.Execute('Drop Table #mytemp');
end

答案 1 :(得分:0)

可从http://msftdpprodsamples.codeplex.com/wikipage?title=SS2008%21Readme_Table-Valued%20Parameters下载的样本是用C ++编写的,但可以很容易地翻译成Delphi。

将代码翻译成Delphi后,您可以使用以下内容通过良好的ADO ADO来访问结果集:

SourcesRecordset := CreateADOObject(CLASS_Recordset) as _Recordset;
RSCon := SourcesRecordset as ADORecordsetConstruction;
RSCon.Rowset := rowset;

LDataSet := TADODataSet.Create(nil);
try
  // Only doing the first result set
  LDataSet.Recordset := SourcesRecordset;
  while not LDataSet.Eof do
  begin
    //... something
    LDataSet.Next;
  end;
finally
  LDataSet.Free;
end;

请注意,CreateADOObjectData.Win.ADODB.pas中的私有函数,但它非常简单。