02.03.2007, 14:18 | #1 |
Участник
|
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. Может ли кто нибудь подсказать - от чего же зависит исполнение в данном случае? Функцию я переписать могу, просто интересно. Спасибо. |
|