Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 ошибка при выполнении в цикле.  [new]
Hermitap
Member

Откуда: Киев
Сообщений: 450
Есть некая сохраненка которая успешно работает

Ее суть по переданному ID посчитать различные суммы, countы....
после чего сделать Update определенной таблицы.

Если эту процедуру просто вызываю из программы то все работает.

Но если мне в цикле в(qa) нужно выполнить ее скажем 20 000 раз с
различными параметрами, то процедура(!!) вываливсется с синтаксическими ошибками. Типа ошибка в коде T-SQL самой сохраненки...

Если задать в цикле...
При цикле в 10 итераций все работает
При цикле в 1000 итераций тоже работает

если задать 20 000 вылетаем по ошибке.. буквально через несколько секунд работы.

Server: Msg 207, Level 16, State 3, Procedure InfoStuffID_NOResult, Line 79
Invalid column name 'Rest'.
Server: Msg 207, Level 16, State 1, Procedure InfoStuffID_NOResult, Line 79
Invalid column name 'Reserve'.

server SQL 2000 sp3

Что может быть?


Картинка с другого сайта.
17 сен 04, 12:05    [967855]     Ответить | Цитировать Сообщить модератору
 Re: ошибка при выполнении в цикле.  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37101
B где код?
17 сен 04, 12:07    [967866]     Ответить | Цитировать Сообщить модератору
 Re: ошибка при выполнении в цикле.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31602
Hermitap

Что может быть?

Я думаю, надо просто искать ошибку в 79-ой строке.
17 сен 04, 12:13    [967889]     Ответить | Цитировать Сообщить модератору
 Re: ошибка при выполнении в цикле.  [new]
Hermitap
Member

Откуда: Киев
Сообщений: 450
Код сохраненки которая выполняется в цикле


В ней несколько лишних и бесполезных строк. процесс отладки идет.
CREATE PROCEDURE InfoStuffID_NOResult

@EntStuffID int,
@StuffID int
AS

SET NOCOUNT ON

/*
dbo.StuffView(S.Species,s.Description,s.DimX,s.DimY,s.Density),
Select
ESWS.EntStuffWorkSpaceID,
CMG.StuffName,
CMG.SerialNum,
CMG.Unit,
CMG.Species,
CMG.hUnit,
CMG.DimX,
CMG.DimY,
CMG.Density,
EG.GroupName,
EG.Archiv,
ESWS.EntStuffID,
ESWS.StuffID,
ESWS.EntGroupID,
ESWS.Topic,
'Rest'=dbo.EntRestOnStuff(ESWS.EntStuffID,ESWS.StuffID),
'Reserve'=dbo.EntReserveOnStuff(ESWS.EntStuffID,ESWS.StuffID)
--'FreeRest' = dbo.EntRestOnStuff(ESWS.EntStuffID,ESWS.StuffID) - dbo.EntReserveOnStuff(ESWS.EntStuffID,ESWS.StuffID)
INTO #TMP
from EntStuffWorkSpace ESWS
LEFT JOIN CorporateMaterialGlossary CMG ON CMG.StuffID = ESWS.StuffID 
LEFT JOIN EntGroup EG ON EG.EntGroupID = ESWS.EntGroupID
Where ESWS.EntStuffID = @EntStuffID
*/



Select
ESWS.EntStuffWorkSpaceID,
'StuffName' = dbo.StuffView(ESWS.Species,ESWS.Description,ESWS.DimX,ESWS.DimY,ESWS.Density),
ESWS.SerialNum,
ESWS.Species,
ESWS.DimX,
ESWS.DimY,
ESWS.Density,
ESWS.hUnit,
ESWS.EntStuffID,
ESWS.StuffID,
ESWS.EntGroupID,
ESWS.Topic,
--'Rest'=dbo.EntRestOnStuffWControlParty(ESWS.EntStuffID,ESWS.StuffID,1),
'Rest'=Round(ISNULL((Select Sum(ISNULL(Qnty,0)) from entWorkSpaceAction (NOLOCK)  Where EntStuffID = ESWS.EntStuffID and StuffID =ESWS.StuffID  and Typeaction = 1  and StatusParty = 1),0) -ISNULL((Select Sum(ISNull(Qnty,0)) from entWorkSpaceAction  (NOLOCK) Where EntStuffID = ESWS.EntStuffID and StuffID = ESWS.StuffID  and Typeaction =2 and StatusParty = 1 ),0),3),
--'Reserve'=dbo.EntReserveOnStuff(ESWS.EntStuffID,ESWS.StuffID),
'Reserve'=ISNULL((Select Sum(ISNull(Qnty,0)) from entWorkSpaceAction  (NOLOCK)  Where EntStuffID = ESWS.EntStuffID and StuffID = ESWS.StuffID  and Typeaction = 3 ),0),
--'NeedControl'=dbo.EntRestOnStuffWControlParty(ESWS.EntStuffID,ESWS.StuffID,0),
'NeedControl'=Round(ISNULL((Select Sum(ISNULL(Qnty,0)) from entWorkSpaceAction (NOLOCK)  Where EntStuffID = ESWS.EntStuffID and StuffID =ESWS.StuffID  and Typeaction = 1  and StatusParty = 0),0) -ISNULL((Select Sum(ISNull(Qnty,0)) from entWorkSpaceAction  (NOLOCK) Where EntStuffID = ESWS.EntStuffID and StuffID = ESWS.StuffID  and Typeaction =2 and StatusParty = 0 ),0),3),
--'Defective'=dbo.EntRestOnStuffWControlParty(ESWS.EntStuffID,ESWS.StuffID,2),
'Defective'=ROUND(ISNULL((Select Sum(ISNULL(Qnty,0)) from entWorkSpaceAction (NOLOCK)  Where EntStuffID = ESWS.EntStuffID and StuffID =ESWS.StuffID  and Typeaction = 1  and StatusParty = 2),0) -ISNULL((Select Sum(ISNull(Qnty,0)) from entWorkSpaceAction  (NOLOCK) Where EntStuffID = ESWS.EntStuffID and StuffID = ESWS.StuffID  and Typeaction =2 and StatusParty = 2 ),0),3),
--'SpecialSanction' = dbo.EntRestOnStuffWControlParty(ESWS.EntStuffID,ESWS.StuffID,3)
'SpecialSanction' = Round(ISNULL((Select Sum(ISNULL(Qnty,0)) from entWorkSpaceAction (NOLOCK)  Where EntStuffID = ESWS.EntStuffID and StuffID =ESWS.StuffID  and Typeaction = 1  and StatusParty = 3),0) -ISNULL((Select Sum(ISNull(Qnty,0)) from entWorkSpaceAction  (NOLOCK) Where EntStuffID = ESWS.EntStuffID and StuffID = ESWS.StuffID  and Typeaction =2 and StatusParty = 3 ),0),3)
INTO #TMP
from EntStuffWorkSpace ESWS  (NOLOCK)
Where ESWS.EntStuffID = @EntStuffID and ESWS.StuffID = @StuffID

--Select * from #TMP


Declare @Rest float
Declare @Reserve float
Declare @NeedControl float
Declare @Defective float
Declare @SpecialSanction float


DECLARE @MaxID int
Select @MaxID = (Select max(EntStuffWorkSpaceID) from EntStuffWorkSpace)

Select TOP 1
 @Rest = Rest,
 @Reserve = Reserve,
 @NeedControl = NeedControl,
 @Defective  = Defective,
 @SpecialSanction = SpecialSanction
 From #TMP 

   

Update EntStuffWorkSpace
Set  
 fRest = isNull(@Rest,0),
 fReserve = isNull(@Reserve,0),
 fNeedControl = isNull(@NeedControl,0),
 fDefective  = isNull(@Defective,0),
 fSpecialSanction = isNull(@SpecialSanction,0)
Where EntStuffID = @EntStuffID and StuffID = @StuffID
 

Drop Table #TMP

SET NOCOUNT OFF
GO
Картинка с другого сайта.
17 сен 04, 12:13    [967892]     Ответить | Цитировать Сообщить модератору
 Re: ошибка при выполнении в цикле.  [new]
Hermitap
Member

Откуда: Киев
Сообщений: 450
Я думаю, надо просто искать ошибку в 79-ой строке.


Нет там ошибки, я ж написал, ошибка если функцию запустить в цикле
только тогда вываливаемся.

вот цикл к примеру
While @i<=20 000
BEGIN

Select @ESID = (Select EntStuffID from #TMP where EntWorkSpaceActionID = @I)
Select @SID =(Select StuffID from #TMP where EntWorkSpaceActionID = @I)

exec InfoStuffID_NOResult @ESID ,@SID

Select @I= @I+1
END


Нонсес, я за 6 лет такого глюка невстречал еще.

Картинка с другого сайта.
17 сен 04, 12:16    [967905]     Ответить | Цитировать Сообщить модератору
 Re: ошибка при выполнении в цикле.  [new]
Лео
Member

Откуда: Москва
Сообщений: 207
Попробуй #TMP заменить на ##TMP или переменную типа table. Только результат напиши. Интересно.
17 сен 04, 12:19    [967918]     Ответить | Цитировать Сообщить модератору
 Re: ошибка при выполнении в цикле.  [new]
Hermitap
Member

Откуда: Киев
Сообщений: 450
ага понял, конфликт #TMP таблиц

одинаковое название в разных запросах...

Картинка с другого сайта.
17 сен 04, 12:25    [967953]     Ответить | Цитировать Сообщить модератору
 Re: ошибка при выполнении в цикле.  [new]
Glory
Member

Откуда:
Сообщений: 104760
Select TOP 1
@Rest = Rest,
@Reserve = Reserve,
@NeedControl = NeedControl,
@Defective = Defective,
@SpecialSanction = SpecialSanction
From #TMP



Update EntStuffWorkSpace
Set
fRest = isNull(@Rest,0),
fReserve = isNull(@Reserve,0),
fNeedControl = isNull(@NeedControl,0),
fDefective = isNull(@Defective,0),
fSpecialSanction = isNull(@SpecialSanction,0)
Where EntStuffID = @EntStuffID and StuffID = @StuffID


Эти два запроса можно объединить в один. Имхо
17 сен 04, 12:26    [967954]     Ответить | Цитировать Сообщить модератору
 Re: ошибка при выполнении в цикле.  [new]
Hermitap
Member

Откуда: Киев
Сообщений: 450
автор
Эти два запроса можно объединить в один. Имхо


Можно 100%
это от отладки осталось. глюк искал.Раскладывал так сказать по полочкам

Конечно, в результате там будет 1 запрос.
17 сен 04, 12:29    [967961]     Ответить | Цитировать Сообщить модератору
 Re: ошибка при выполнении в цикле.  [new]
Лео
Member

Откуда: Москва
Сообщений: 207
Так как результат?
17 сен 04, 12:34    [967985]     Ответить | Цитировать Сообщить модератору
 Re: ошибка при выполнении в цикле.  [new]
Hermitap
Member

Откуда: Киев
Сообщений: 450
Хм. вообщем все заработало. Конфликт #TMP таблиц.

Это название использовалось и в сохраненке и в цикле, хотя структуры слегка разные...


Спасибо Лео, натолкнул на мысль.


p.s
Только вот теперь непонятно почему 100 и 1000 раз запрос заканчивался
без ошибок.



Картинка с другого сайта.
17 сен 04, 12:35    [967990]     Ответить | Цитировать Сообщить модератору
 Re: ошибка при выполнении в цикле.  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37101
а) попробовать заменить select into на create table и insert into
б) попробовать заменить временную таблицу на табличную переменную
17 сен 04, 12:38    [968008]     Ответить | Цитировать Сообщить модератору
 Re: ошибка при выполнении в цикле.  [new]
Glory
Member

Откуда:
Сообщений: 104760
Только вот теперь непонятно почему 100 и 1000 раз запрос заканчивался
без ошибок.

При обращении к временной таблице сперва ищется временная таблица созданная в этом же бэтче. Если ее нет то в вызывающем бэтче. Если и там нет то в вызывающем-вызывающем бэтче. И тд
Если вдруг по каким-то причинам внутри процедуры временная таблица не была создана, то естественно произошло обращение к временной таблице из цикла
17 сен 04, 12:39    [968014]     Ответить | Цитировать Сообщить модератору
 Re: ошибка при выполнении в цикле.  [new]
Лео
Member

Откуда: Москва
Сообщений: 207
Я думаю конфликт не в этом, а в распараллеливании скулем операции. В одной из веток он убивал таблицу раньше, чем другая к ней обращалась, это можно проверить по старой верси, поигравшись с транзакциями, а алгоритм обработки наверное зависит от числа циклов. Но все это ихмо. А вообще решилась проблемма и хорошо.
17 сен 04, 12:41    [968024]     Ответить | Цитировать Сообщить модератору
 Re: ошибка при выполнении в цикле.  [new]
Glory
Member

Откуда:
Сообщений: 104760
а в распараллеливании скулем операции.
Распараллеливаются все-таки запросы не целиком бэтчи и процедуры
17 сен 04, 12:43    [968032]     Ответить | Цитировать Сообщить модератору
 Re: ошибка при выполнении в цикле.  [new]
Лео
Member

Откуда: Москва
Сообщений: 207
Был не прав, признаю.
17 сен 04, 15:02    [968774]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить