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

Откуда:
Сообщений: 36
Всем привет, просьба помочь.
Есть две таблицы _TTN (шапка) и _TTN_GDS (строки) (вложение)


Теперь из этих временных таблиц нужно перести в Постоянные TTN (шапка) и TTN_GDS (строки) при переносе необходимо:
Переноси шапку после переносим все строки с таким же Shop_to как и в шапке, если у строк Shop_to отличаеться - создавать новуюстрочку в шаке с новым id_T и Shop_to должен быть такой же как и у строк Driver_id = для всех новых строк такой же как и был в темповой шапке

К сообщению приложен файл. Размер - 5Kb
27 мар 14, 14:29    [15794946]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь в написании вложеных курсоров  [new]
Glory
Member

Откуда:
Сообщений: 104751
А причем тут вложенные курсоры ?
Используйте MERGE
27 мар 14, 14:35    [15794987]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь в написании вложеных курсоров  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
anrrry, рекомендую прочитать Рекомендации по оформлению сообщений в форуме, в частности, пункт 10. И привести информацию о том, что вы уже делали, чтобы выполнить задачу, и с какими сложностями столкнулись.

Если задачу нужно выполнить за вас, то тогда вы ошиблись форумом, вам в форум Работа
27 мар 14, 14:35    [15794993]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь в написании вложеных курсоров  [new]
anrrry
Member

Откуда:
Сообщений: 36
Minamoto,

Я написал процедуру с курсором, которая производит переброску этой инфомации с временных таблиц в постоянные, но не учитывает какой стоит SHOP_TO, тоесть как лежит все в временных так и переносит.
Акак сделать что бы создавало я, к сожелению, не знаю, так как только начинающий
27 мар 14, 14:49    [15795095]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь в написании вложеных курсоров  [new]
Glory
Member

Откуда:
Сообщений: 104751
anrrry
Акак сделать что бы создавало я, к сожелению, не знаю, так как только начинающий

Интересно, а как же вы тогда сделали " переброску этой инфомации с временных таблиц в постоянные" ?
Что это за команда "переброска" ?
27 мар 14, 14:51    [15795118]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь в написании вложеных курсоров  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
anrrry
Minamoto,

Я написал процедуру с курсором, которая производит переброску этой инфомации с временных таблиц в постоянные, но не учитывает какой стоит SHOP_TO, тоесть как лежит все в временных так и переносит.
Акак сделать что бы создавало я, к сожелению, не знаю, так как только начинающий

Так приведите код процедуры.
27 мар 14, 15:38    [15795530]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь в написании вложеных курсоров  [new]
anrrry
Member

Откуда:
Сообщений: 36
Minamoto,

ALTER procedure [dbo].[sp_TTNToTTN] (
       @TTN_ID int,				/* ID TTN */
       @SHOPS_ID  int			/* ID магазина */             
       )
AS
BEGIN

	SET NOCOUNT ON;
	SET LOCK_TIMEOUT 40000;
	--set xact_abort on
    DECLARE  @ErrorStatus int, @ErrorTXT varchar(255);
    SET @ErrorStatus=0;
    
    DECLARE  @NEW_TTN_ID int;
    DECLARE  @TmpCount INT;--, @DEPART_FROM int;
   
    
    
    BEGIN TRANSACTION

    	INSERT INTO TTN
    	(
    		-- TTN_ID -- this column value is auto-generated
    		DRIVER_ID,
    		SHOP_TO
    	)
    	SELECT     		
    		[DRIVER_ID],
    		[SHOP_TO]
    	FROM _TTN AS t
    	WHERE  t.TTN_ID = @TTN_ID
   
     SELECT @ErrorStatus = @@ERROR, @NEW_TTN_ID = CASE WHEN @ErrorStatus = 0 THEN SCOPE_IDENTITY() ELSE 0 END
   
    
    IF @ErrorStatus<>0 GOTO DONE;

    
    /*--- перебрасываем строки ---*/     
    DECLARE @TTN_GDS_ID INT,  @ORDERS_ID int, @SHOP_TO INT

	DECLARE INS_TTN_GDS CURSOR FOR
	SELECT  
       TTN_GDS_ID     
      ,[ORDERS_ID]
      ,[SHOP_TO]
    FROM  _TTN_GDS 
      WHERE TTN_ID=@TTN_ID;

	OPEN INS_TTN_GDS
	FETCH NEXT FROM INS_TTN_GDS
	INTO @TTN_GDS_ID,@ORDERS_ID, @SHOP_TO
    
    WHILE @@FETCH_STATUS = 0
    BEGIN
      /* --- удаляем временную запись в резерве ---*/ 
      DELETE FROM _TTN_GDS WHERE TTN_GDS_ID=@TTN_GDS_ID      

      SET @ErrorStatus=@@Error;
      IF @ErrorStatus<>0 GOTO DONE;
      /* --- добавляем строку в TTN ---*/ 
      INSERT INTO TTN_GDS
      (
      	-- TTN_GDS_ID -- this column value is auto-generated
      	TTN_ID,
      	SHOPS_ID,
      	ORDERS_ID,
      	SHOP_TO
      )
      VALUES
      (
      	@NEW_TTN_ID,
      	@SHOPS_ID,
      	@ORDERS_ID,
      	@SHOP_TO
      )
      

      SET @ErrorStatus=@@Error;
      IF @ErrorStatus<>0 GOTO DONE;

	  FETCH NEXT FROM INS_TTN_GDS
	  INTO @TTN_GDS_ID,@ORDERS_ID, @SHOP_TO

   
  /*--- удаляем временную шапку --- */    

    DELETE from _TTN 
      where TTN_ID=@TTN_ID;
    SET @ErrorStatus=@@Error;
    IF @ErrorStatus<>0 GOTO DONE;
 
DONE:
   CLOSE INS_TTN_GDS
   DEALLOCATE INS_TTN_GDS
   IF @@TRANCOUNT <> 0
   BEGIN
      IF @ErrorStatus = 0 COMMIT TRANSACTION
         ELSE             ROLLBACK TRANSACTION
   END
  
   RETURN (@ErrorStatus)
    
END



ALTER procedure [dbo].[sp_TTNToTTN] (
       @TTN_ID int,				/* ID TTN */
       @SHOPS_ID  int			/* ID магазина */             
       )
AS
BEGIN

	SET NOCOUNT ON;
	SET LOCK_TIMEOUT 40000;
	--set xact_abort on
    DECLARE  @ErrorStatus int, @ErrorTXT varchar(255);
    SET @ErrorStatus=0;
    
    DECLARE  @NEW_TTN_ID int;
    DECLARE  @TmpCount INT;--, @DEPART_FROM int;
   
    
    
    BEGIN TRANSACTION

    	INSERT INTO TTN
    	(
    		-- TTN_ID -- this column value is auto-generated
    		DRIVER_ID,
    		SHOP_TO
    	)
    	SELECT     		
    		[DRIVER_ID],
    		[SHOP_TO]
    	FROM _TTN AS t
    	WHERE  t.TTN_ID = @TTN_ID
   
     SELECT @ErrorStatus = @@ERROR, @NEW_TTN_ID = CASE WHEN @ErrorStatus = 0 THEN SCOPE_IDENTITY() ELSE 0 END
   
    
    IF @ErrorStatus<>0 GOTO DONE;

    
    /*--- перебрасываем строки ---*/     
    DECLARE @TTN_GDS_ID INT,  @ORDERS_ID int, @SHOP_TO INT

	DECLARE INS_TTN_GDS CURSOR FOR
	SELECT  
       TTN_GDS_ID     
      ,[ORDERS_ID]
      ,[SHOP_TO]
    FROM  _TTN_GDS 
      WHERE TTN_ID=@TTN_ID;

	OPEN INS_TTN_GDS
	FETCH NEXT FROM INS_TTN_GDS
	INTO @TTN_GDS_ID,@ORDERS_ID, @SHOP_TO
    
    WHILE @@FETCH_STATUS = 0
    BEGIN
      /* --- удаляем временную запись в резерве ---*/ 
      DELETE FROM _TTN_GDS WHERE TTN_GDS_ID=@TTN_GDS_ID      

      SET @ErrorStatus=@@Error;
      IF @ErrorStatus<>0 GOTO DONE;
      /* --- добавляем строку в TTN ---*/ 
      INSERT INTO TTN_GDS
      (
      	-- TTN_GDS_ID -- this column value is auto-generated
      	TTN_ID,
      	SHOPS_ID,
      	ORDERS_ID,
      	SHOP_TO
      )
      VALUES
      (
      	@NEW_TTN_ID,
      	@SHOPS_ID,
      	@ORDERS_ID,
      	@SHOP_TO
      )
      

      SET @ErrorStatus=@@Error;
      IF @ErrorStatus<>0 GOTO DONE;

	  FETCH NEXT FROM INS_TTN_GDS
	  INTO @TTN_GDS_ID,@ORDERS_ID, @SHOP_TO

   
  /*--- удаляем временную шапку --- */    

    DELETE from _TTN 
      where TTN_ID=@TTN_ID;
    SET @ErrorStatus=@@Error;
    IF @ErrorStatus<>0 GOTO DONE;
 
DONE:
   CLOSE INS_TTN_GDS
   DEALLOCATE INS_TTN_GDS
   IF @@TRANCOUNT <> 0
   BEGIN
      IF @ErrorStatus = 0 COMMIT TRANSACTION
         ELSE             ROLLBACK TRANSACTION
   END
  
   RETURN (@ErrorStatus)
    
END


Сообщение было отредактировано: 27 мар 14, 16:01
27 мар 14, 15:56    [15795666]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь в написании вложеных курсоров  [new]
Glory
Member

Откуда:
Сообщений: 104751
А почему вы не хотите сделать сразу INSERT INTO TTN_GDS _всех_ нужных записей из _TTN_GDS ?
Как вы сделали это для TTN и _TTN ?
27 мар 14, 16:03    [15795712]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь в написании вложеных курсоров  [new]
anrrry
Member

Откуда:
Сообщений: 36
Glory,

А после переноса уже анализировать и создавать нужные шапки?
27 мар 14, 16:09    [15795750]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь в написании вложеных курсоров  [new]
Glory
Member

Откуда:
Сообщений: 104751
anrrry
А после переноса уже анализировать и создавать нужные шапки?

Начните с написания SELECT-ов
Которые вернут вам 2 результата, те, которые должны попастьв кждую из таблиц
А потом просто к каждому из SELECT-ов сверху допишите INSERT
27 мар 14, 16:11    [15795778]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь в написании вложеных курсоров  [new]
Ivan Durak
Member

Откуда: Minsk!!!
Сообщений: 3755
разбираться лень но готов ставить что курсоры тут без надобности
27 мар 14, 16:13    [15795789]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь в написании вложеных курсоров  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
Glory
А почему вы не хотите сделать сразу INSERT INTO TTN_GDS _всех_ нужных записей из _TTN_GDS ?
Как вы сделали это для TTN и _TTN ?

Вот у меня примерно тот же вопрос.

В упор не пойму, зачем тут курсор.
Вместо него можно написать:

INSERT INTO TTN_GDS
      (
      	-- TTN_GDS_ID -- this column value is auto-generated
      	TTN_ID,
      	SHOPS_ID,
      	ORDERS_ID,
      	SHOP_TO
      )
SELECT  
       @NEW_TTN_ID
     @SHOPS_ID
      ,[ORDERS_ID]
      ,[SHOP_TO]
    FROM  _TTN_GDS 
      WHERE TTN_ID=@TTN_ID;



Единственное, если вам нужно добавить еще какие то записи в TTN ("создавать новуюстрочку в шаке с новым id_T и Shop_to должен быть такой же как и у строк Driver_id = для всех новых строк такой же как и был в темповой шапке"), то нужно предварительно такую вставку сделать.
27 мар 14, 16:16    [15795825]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь в написании вложеных курсоров  [new]
anrrry
Member

Откуда:
Сообщений: 36
Ivan Durak,

Курсор нужен, мне кажеться, потому что у каждой из таблиц свой автоинкременый ИД, тоесть если во временной таблице у шапки был ИД 1 то при переносе в постоянную у него он может измениться
27 мар 14, 16:20    [15795860]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь в написании вложеных курсоров  [new]
Glory
Member

Откуда:
Сообщений: 104751
anrrry
Курсор нужен, мне кажеться, потому что у каждой из таблиц свой автоинкременый ИД, тоесть если во временной таблице у шапки был ИД 1 то при переносе в постоянную у него он может измениться

И добавление записи по-одной чем-то будет отличаться от добваления нескольких записей разом ?
27 мар 14, 16:28    [15795920]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь в написании вложеных курсоров  [new]
anrrry
Member

Откуда:
Сообщений: 36
Glory,

Скорей всего, нет
27 мар 14, 16:44    [15796068]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь в написании вложеных курсоров  [new]
anrrry
Member

Откуда:
Сообщений: 36
Glory,

Отличаться будет тем, что мне нужно для тех строк у которых SHOP_TO разный создавать в TTN новую строчку с новым TTN_ID
27 мар 14, 22:59    [15797723]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь в написании вложеных курсоров  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
anrrry
Glory,

Отличаться будет тем, что мне нужно для тех строк у которых SHOP_TO разный создавать в TTN новую строчку с новым TTN_ID
Ну тогда сначала вставьте в таблицу, а потом сделайте из нее SELECT и получите ваши новые TTN_ID.
28 мар 14, 02:18    [15798447]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь в написании вложеных курсоров  [new]
anrrry
Member

Откуда:
Сообщений: 36
Glory
Начните с написания SELECT-ов
Которые вернут вам 2 результата, те, которые должны попастьв кждую из таблиц
А потом просто к каждому из SELECT-ов сверху допишите INSERT


Спасибо, что на толкнули на мысль, все получилось.
28 мар 14, 13:53    [15800674]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить