在我的应用程序中,我将 TADOQuery 与 select (MSSQL) 一起使用,并与其 TClientDataSet 链接。我必须插入大约一百万条记录并应用更新。
那么我在 SQL Server Profiler 中看到了什么?我看到对于每个插入的行,我们有 3 个查询:插入脚本的 sp_prepare、sp_execute 它与一些值和 sp_unprepare。
我只想在插入之前为所有记录准备一次sql,然后取消准备。我该怎么做?
添加时间:
在查询中,我有一个用于存储过程执行的脚本:
tmpQuery := DefineQuery(FConnection, [
'exec up_getOperatorDataSet ',
' @tablename = :tablename, ',
' @operator = :operator, ',
' @forappend = :forappend, ',
' @withlinksonly = :withlinksonly, ',
' @ids = :ids '
], [
Param(ftString, sTableName),
Param(ftInteger, FOperatorId),
Param(ftBoolean, opForAppendOnly in OpenParams),
Param(ftBoolean, opOnlyWithModelLinks in OpenParams),
Param(ftString, sIds)
], Result);
它使用一些参数从表 sTableName 中选择所有字段。
从探查器插入的示例:
第 1 步:
declare @p1 int
set @p1=486
exec sp_prepare @p1 output,N'@P1 int,@P2 int,@P3 datetime,@P4 int,@P5 int,@P6 int,@P7 int,@P8 int,@P9 varchar(128),@P10 bit,@P11 numeric(19,4),@P12 smallint,@P13 smallint,@P14 smallint,@P15 smallint',N'insert into parser_prices
(operator_id, request_id, date, nights, model_hotel_id, model_meal_id, model_room_id, model_htplace_id, spo, hotelstop, price, frout_econom, frout_business, frback_econom, frback_business)
values
(@P1, @P2, @P3, @P4, @P5, @P6, @P7, @P8, @P9, @P10, @P11, @P12, @P13, @P14, @P15)
',1
select @p1
第 2 步:
exec sp_execute 486,21,2000450,'2009-12-04 00:00:00',14,2118,22,-9555,18,'2009-10.MSK.Bali.13.10.09-27.03.10',0,15530.0000,3,3,3,3
第 3 步:
exec sp_unprepare 486
它适用于所有新行。
最佳答案
因为您调用的是存储过程,而不是代码中的内联查询,所以 SQL Server 将对存储过程的每次调用视为单独的调用,每次准备和取消准备也是如此。我不确定是否有办法解决这个问题。
如果存储过程中发生的任何事情都可以通过代码中的查询来完成,那么您可以使用这样的结构,该结构只会在第一次准备 SQL 语句:
{Prepare the insert query}
ADOQuery1.SQL.Append('INSERT INTO Tablename');
ADOQuery1.SQL.Append('(StringField1, IntField2)'); {repeat as necessary}
ADOQuery1.SQL.Append('VALUES (:sFieldValue1, :sFieldValue2)'); {repeat as necessary}
ADOQuery1.SQL.Prepare;
{In a For, While, Repeat loop, use:}
ADOQuery1.ParamByName('sFieldValue1').AsString := 'Value for field 1';
ADOQuery1.ParamByName('sFieldValue2').AsInteger := 2;
ADOQuery1.ExecSQL;
抱歉,如果我还没有完全掌握 ADOQuery 组件的属性和方法名称,我现在不在我的 Delphi PC 上,而且我通常不使用 TADO 组件,但这个概念仍然适用这是一个TDataSet 概念。
关于sql-server - TClientDataSet 和大插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1687253/