我需要将参数作为SQL Server中存储过程的表值传递。如何在Delphi中处理这个?
答案 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;
请注意,CreateADOObject
是Data.Win.ADODB.pas
中的私有函数,但它非常简单。