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

Откуда:
Сообщений: 43
	SET ANSI_NULLS OFF
	
	DECLARE @ID INT
	DECLARE @ID1 VARCHAR(20)
	DECLARE @IDCode VARCHAR(10)
	DECLARE @Weight FLOAT
	DECLARE @Col INT
	DECLARE @Sr_Srok INT
	DECLARE @ColDostavok1 INT
	DECLARE @ColDostavok2 INT
	DECLARE @ColDostavok3 INT
	DECLARE @ColDostavokb3 INT	
	DECLARE @WaybillDate DATETIME
	DECLARE @DeliveryDT DATETIME
			 
	UPDATE AAA_TMP_City SET NodeID = AC.NodeID, AcPointCode = Ac.AcPointCode
	FROM (SELECT CN.NodeID, AC1.Title, AC1.AcPointCode
			FROM CL_Nodes AS  CN RIGHT JOIN MT_AcPoints AS AC1  ON CN.AcPointId = AC1.NodeId AND CN.NodeID <> 11) AS Ac
	WHERE AAA_TMP_City.Title = Ac.Title

	 DECLARE CT CURSOR FOR 
						   SELECT NodeID, AcPointCode FROM AAA_TMP_City
	 OPEN CT
	 WHILE 1=1 BEGIN
	  FETCH FROM CT INTO @ID, @IDCode
	  IF @@fetch_status=0 BEGIN 
		
		SET @Sr_Srok = 0
		SET @ColDostavok1 = 1
		SET @ColDostavok2 = 2
		SET @ColDostavok3 = 0
		SET @ColDostavokb3 = 0
		
        SET @COL =(SELECT COUNT(WaybillNumber) FROM W_Waybills WHERE 
                                       WaybillDate >= @DateTo AND WaybillDate <= @DateFrom AND AcPointFrom = 'MOW' --AND EntryNode = 12
                                       AND AcPointTo = @IDCode AND ServiceId = @ServiceId)
        
         
        SET @Weight =(SELECT ROUND(SUM( CASE WHEN ISNULL(CheckWeight, 0) <> 0 
				       THEN CheckWeight
				       ELSE Weight END), 2) FROM W_Waybills 
                                                          WHERE  WaybillDate >= @DateTo AND WaybillDate <= @DateFrom 
                                                          AND AcPointFrom = 'MOW'  AND AcPointTo = @IDCode AND ServiceId = @ServiceId) 
                                       
			
			
			DECLARE CT1 CURSOR FOR 
						  SELECT WaybillNumber FROM W_Waybills 
                                                                               WHERE  WaybillDate >= @DateTo AND WaybillDate <= @DateFrom AND  
                                                                               AcPointFrom = 'MOW' AND AcPointTo = @IDCode AND ServiceId = @ServiceId
			OPEN CT1 
			 WHILE 1=1 BEGIN
			  FETCH FROM CT1 INTO @ID1
			  IF @@fetch_status=0 BEGIN                                                                             
	        
					SET @WaybillDate = (SELECT W.WaybillDate
							   FROM W_Waybills AS W INNER JOIN W_Deliveries D ON    W.WaybillNumber = D.WaybillNumber WHERE MultiAddress = 0 AND W.WaybillNumber = @ID1)
					SET @DeliveryDT = (SELECT D.DeliveryDT 
							FROM W_Waybills AS W INNER JOIN W_Deliveries D ON W.WaybillNumber = D.WaybillNumber WHERE MultiAddress = 0 AND W.WaybillNumber = @ID1)
					
					IF dbo.udf_GetCountJobDays(@WaybillDate, @DeliveryDT, 0) = 1
						SET @ColDostavok1 = @ColDostavok1 + 1
					IF dbo.udf_GetCountJobDays(@WaybillDate, @DeliveryDT, 0) = 2
						SET @ColDostavok2 = @ColDostavok2 + 1
					IF dbo.udf_GetCountJobDays(@WaybillDate, @DeliveryDT, 0) = 3
						SET @ColDostavok3 = @ColDostavok3 + 1
					IF dbo.udf_GetCountJobDays(@WaybillDate, @DeliveryDT, 0) > 3
						SET @ColDostavokb3 = @ColDostavokb3 + 1
						
					--PRINT @ID1
			  END
			  IF @@fetch_status=-1 
				  BREAK
			  IF @@fetch_status=-2
				  CONTINUE
			 END
			 DEALLOCATE CT1
    
        UPDATE AAA_TMP_City SET @COL = @COL WHERE NodeID = @ID
        UPDATE AAA_TMP_City SET Weight = @Weight WHERE NodeID = @ID
        UPDATE AAA_TMP_City SET Sr_Srok = @Sr_Srok WHERE NodeID = @ID
        
        UPDATE AAA_TMP_City SET [1d] = @ColDostavok1 WHERE NodeID = @ID
        UPDATE AAA_TMP_City SET [2d] = @ColDostavok2 WHERE NodeID = @ID
        UPDATE AAA_TMP_City SET [3d] = @ColDostavok3 WHERE NodeID = @ID
        UPDATE AAA_TMP_City SET [b3d] = @ColDostavokb3 WHERE NodeID = @ID
        
        PRINT @ID 
		--PRINT @IDCode 
		PRINT @ColDostavok1
	  END
	  IF @@fetch_status=-1 
		  BREAK
	  IF @@fetch_status=-2
		  CONTINUE
	 END
	 DEALLOCATE CT
    
END

Доброго времени суток! Вот возникла проблема со вложенным курсором, внешний курсор проходит первую запись, входит во вложенный, проходит по вложенному все записи и потом вылетает, тобиш апдейт происходит тока 1 записи по внешнему курсору. В чем может быть ошибка подскажите плиз?
1 июн 11, 11:30    [10743825]     Ответить | Цитировать Сообщить модератору
 Re: Вложенный курсор  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
Где Вы набрались этой пошлости Вы научились так писать курсоры?!

1. Уберите
WHILE 1=1 BEGIN и
IF @@fetch_status=-1
BREAK
IF @@fetch_status=-2
CONTINUE

2. Проход по курсору организуйте как

OPEN ...
FETCH FROM...
WHILE  @@fetch_status = 0 BEGIN


  FETCH FROM...
END
CLOSE
DEALLOCATE


А то Вы проверяете во внешнем курсоре результат @@fetch_status от последнего феча во внутреннем, и естественно, вылетаете из него.
1 июн 11, 11:55    [10744066]     Ответить | Цитировать Сообщить модератору
 Re: Вложенный курсор  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Проверил. EXEC в курсоре нет. Значит он точно не нужен.

Ответ: ошибка синтаксиса - "CURSOR" Unknown data type.
1 июн 11, 11:57    [10744090]     Ответить | Цитировать Сообщить модератору
 Re: Вложенный курсор  [new]
Kamenyka
Member

Откуда:
Сообщений: 43
pkarklin
Где Вы набрались этой пошлости Вы научились так писать курсоры?!


Все заработало!) Большое спасибо за помощь! В предь буду учитывать всевозможные варианты вызова курсора :)
1 июн 11, 12:48    [10744595]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить