Тема: Prepared Execution
Показать сообщение отдельно
Старый 02.03.2007, 14:18   #1  
VORP is offline
VORP
Участник
Аватар для VORP
 
146 / 95 (4) ++++
Регистрация: 26.05.2006
Prepared Execution
Странное дело:
есть запрос:
while select inventJournalTrans
where inventJournalTrans.JournalId == _Id
{
,,,
inventJournalTransNEW.insertFromCode();

}
на самом деле вроде ращепления строк.
Под одним пользователем работает нормально, под другим зацикливается, то есть в курсор попадают новые строки, которые добавляются в цикле.
Различия в профайлере видны ниже:
нормально работает
declare @P1 int
set @P1=12
declare @P2 int
set @P2=180150008
declare @P3 int
set @P3=2
declare @P4 int
set @P4=2
declare @P5 int
set @P5=-1
exec sp_cursorprepexec @P1 output, @P2 output, N'@P1 varchar(1000),@P2 varchar(1000),@P3 numeric(28,12)', N'SELECT A.JOURNALID,A.LINENUM,A.TRANSDATE,A.VOUCHER,A.JOURNALTYPE,A.ITEMID,A.QTY,A.COSTPRICE,A.PRICEUNIT,A.COSTMARKUP,A.COSTAMOUNT,A.SALESAMOUNT,A.INVENTTRANSID,A.INVENTTRANSIDFATHER,A.LEDGERACCOUNTIDOFFSET,A.INVENTONHAND,A.COUNTED,A.DIMENSION,A.DIMENSION2_,A.DIMENSION3_,A.DIMENSION4_,A.DIMENSION5_,A.DIMENSION6_,A.DIMENSION7_,A.DIMENSION8_,A.DEL_LOG,A.BOMLINE,A.DEL_POSTED,A.DEL_CONFIGID,A.INVENTTRANSIDRETURN,A.INVENTDIMID,A.TOINVENTDIMID,A.REQPOID,A.EMPLID,A.ASSETTRANSTYPE,A.PROJTAXGROUPID,A.PROJSALESCURRENCYID,A.PROJTAXITEMGROUPID,A.PROJUNITID,A.INVENTREFTYPE,A.INVENTREFID,A.INVENTREFTRANSID,A.SCRAPTYPEID_RU,A.DEL_REPORTID_RU,A.DEL_OFFSESSIONID_RU,A.RECID FROM INVENTJOURNALTRANS A(UPDLOCK) WHERE ((DATAAREAID=@P1) AND ((JOURNALID=@P2) AND (QTY<>@P3))) OPTION(FAST 22)', @P3 output, @P4 output, @P5 output, 'rfn', 'СЖ00009264', 0.000000000000
select @P1, @P2, @P3, @P4, @P5

зацикливается
declare @P1 int
set @P1=15
declare @P2 int
set @P2=180150017
declare @P3 int
set @P3=2
declare @P4 int
set @P4=2
declare @P5 int
set @P5=-1
exec sp_cursorprepexec @P1 output, @P2 output, N'@P1 varchar(1000),@P2 varchar(1000),@P3 numeric(28,12)', N'SELECT A.JOURNALID,A.LINENUM,A.TRANSDATE,A.VOUCHER,A.JOURNALTYPE,A.ITEMID,A.QTY,A.COSTPRICE,A.PRICEUNIT,A.COSTMARKUP,A.COSTAMOUNT,A.SALESAMOUNT,A.INVENTTRANSID,A.INVENTTRANSIDFATHER,A.LEDGERACCOUNTIDOFFSET,A.INVENTONHAND,A.COUNTED,A.DIMENSION,A.DIMENSION2_,A.DIMENSION3_,A.DIMENSION4_,A.DIMENSION5_,A.DIMENSION6_,A.DIMENSION7_,A.DIMENSION8_,A.DEL_LOG,A.BOMLINE,A.DEL_POSTED,A.DEL_CONFIGID,A.INVENTTRANSIDRETURN,A.INVENTDIMID,A.TOINVENTDIMID,A.REQPOID,A.EMPLID,A.ASSETTRANSTYPE,A.PROJTAXGROUPID,A.PROJSALESCURRENCYID,A.PROJTAXITEMGROUPID,A.PROJUNITID,A.INVENTREFTYPE,A.INVENTREFID,A.INVENTREFTRANSID,A.SCRAPTYPEID_RU,A.DEL_REPORTID_RU,A.DEL_OFFSESSIONID_RU,A.RECID FROM INVENTJOURNALTRANS A(UPDLOCK) WHERE ((DATAAREAID=@P1) AND ((JOURNALID=@P2) AND (QTY<>@P3))) OPTION(FAST 22)', @P3 output, @P4 output, @P5 output, 'rfn', 'СЖ00009264', 0.000000000000
select @P1, @P2, @P3, @P4, @P5
exec sp_cursorclose 180150008

Жирным выделены различия.
То есть во втором случае курсор всякий раз открывается и закрывается заново, что и приводит к зацикливанию(?).

Вопросы:
1. Что за первый параметр у sp_cursorprepExec?
2. Может ли кто нибудь подсказать - от чего же зависит исполнение в данном случае?

Функцию я переписать могу, просто интересно.
Спасибо.