使用进程时间限制中止SQL查询

时间:2013-02-03 16:12:39

标签: sql-server delphi ado

我可以使用DELPHI,dbgo数据库组件和SQL Server数据库服务器编写SQL查询,这些查询在处理时间方面受到限制吗?

喜欢

select * from table where ......  

process_time_limit = 5 sec

最好在一个时间限制内给我10%的行,而不是等待完整的查询数据集

1 个答案:

答案 0 :(得分:3)

ADO组件:

我会尝试异步数据提取。当您执行查询时,您将记住启动时间,每次OnFetchProgress事件触发时,您都会检查EventStatus是否仍处于esOK状态,检查查询执行所用的时间。如果已经过了,您可以使用数据集上的Cancel方法取消数据提取。

我打算使用类似以下(未经测试的)伪代码的东西:

var
  FQueryStart: DWORD;

procedure TForm1.FormCreate(Sender: TObject);
begin
  // configure the asynchronous data fetch for dataset
  ADOQuery1.ExecuteOptions := [eoAsyncExecute, eoAsyncFetchNonBlocking];
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  // store the query execution starting time and execute a query
  FQueryStart := GetTickCount;
  ADOQuery1.SQL.Text := 'SELECT * FROM Table';
  ADOQuery1.Open;
end;

procedure TForm1.ADOQuery1FetchProgress(DataSet: TCustomADODataSet; Progress,
  MaxProgress: Integer; var EventStatus: TEventStatus);
begin
  // if the fetch progress is in esOK (adStatusOK) status and the time since
  // the query has been executed (5000 ms) elapsed, cancel the query
  if (EventStatus = esOK) and (GetTickCount - FQueryStart >= 5000) then
    DataSet.Cancel;
end;