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

Откуда: Республика Дагестан,Махачкала
Сообщений: 246
Здравствуйте.

Необходимо загрузить данные(проставить адреса на лицевых счетах) из таблицы tmpTY в основную [Лицевые счета].
-- Загрузка адресов в точки учета
DECLARE


@ROWID_LS varchar(200),
@DOGOVOR_NM varchar(200),
@ADDRESS_LS varchar(200) 


DECLARE SELECT_GET_TY_INFO CURSOR
FOR SELECT ty.[Номер], ty.АдресТУ FROM [tmpTY] ty

OPEN SELECT_GET_TY_INFO

FETCH NEXT FROM SELECT_GET_TY_INFO INTO @DOGOVOR_NM, @ADDRESS_LS


DECLARE SELECT_GET_LS CURSOR
FOR SELECT ls.ROW_ID 
      FROM [Лицевые договора] ld,
           [Договор] d,
           [Лицевые счета] ls
     WHERE ld.Договор = d.ROW_ID
       AND ld.Лицевой = ls.ROW_ID
       AND d.Номер = @DOGOVOR_NM
       AND d._Участок = '316116036'
       --AND d.Номер = '23270010'
       AND YEAR(ld.ДатКнц) > 2015

OPEN SELECT_GET_LS

FETCH NEXT FROM SELECT_GET_LS INTO @ROWID_LS


WHILE @@FETCH_STATUS = 0 

BEGIN


   UPDATE [Лицевые счета] SET АдресЛС = @ADDRESS_LS WHERE ROW_ID = @ROWID_LS;
   
   FETCH NEXT FROM SELECT_GET_TY_INFO INTO @DOGOVOR_NM, @ADDRESS_LS

   FETCH NEXT FROM SELECT_GET_LS INTO @ROWID_LS
  
END


CLOSE SELECT_GET_TY_INFO
DEALLOCATE SELECT_GET_TY_INFO

CLOSE SELECT_GET_LS
DEALLOCATE SELECT_GET_LS

Ответ от сервера пришел очень быстро и без количества обработанных строк: "Выполнение команд успешно завершено."
Думаю проблема в курсорах. Подскажите пожалуйста.

Выполнил по конкретному договору:
DECLARE SELECT_GET_LS CURSOR
FOR SELECT ls.ROW_ID 
      FROM [Лицевые договора] ld,
           [Договор] d,
           [Лицевые счета] ls
     WHERE ld.Договор = d.ROW_ID
       AND ld.Лицевой = ls.ROW_ID
       --AND d.Номер = @DOGOVOR_NM
       AND d._Участок = '316116036'
       AND d.Номер = '23270010'
       AND YEAR(ld.ДатКнц) > 2015

Скрипт добавил адрес на лицевые счета, но не тот адрес.
Добавил адрес с первой строки таблицы.
27 мар 15, 10:38    [17438834]     Ответить | Цитировать Сообщить модератору
 Re: Передача параметра из одного курсора в другой  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Все, что тут написано, делается одним запросом. Городить два вложенных курсора не обязательно.
27 мар 15, 10:40    [17438841]     Ответить | Цитировать Сообщить модератору
 Re: Передача параметра из одного курсора в другой  [new]
Glory
Member

Откуда:
Сообщений: 104751
Асланали
Думаю проблема в курсорах. Подскажите пожалуйста.

Надо было не думать, а просто прочитать в хелпе статью про DECLARE CURSOR

Variables may be used as part of the select_statement that declares a cursor. Cursor variable values do not change after a cursor is declared. In SQL Server version 6.5 and earlier, variable values are refreshed every time a cursor is reopened.

ЗЫ
А задача "загрузить данные(проставить адреса на лицевых счетах) из таблицы tmpTY в основную [Лицевые счета]." решается одним запросом
27 мар 15, 10:41    [17438849]     Ответить | Цитировать Сообщить модератору
 Re: Передача параметра из одного курсора в другой  [new]
Асланали
Member

Откуда: Республика Дагестан,Махачкала
Сообщений: 246
Как это будет выглядеть не подскажите?
27 мар 15, 10:42    [17438851]     Ответить | Цитировать Сообщить модератору
 Re: Передача параметра из одного курсора в другой  [new]
Glory
Member

Откуда:
Сообщений: 104751
Асланали
Как это будет выглядеть не подскажите?

Как команда UPDATE с использованеим нескольких таблиц
https://msdn.microsoft.com/en-us/library/ms177523.aspx?f=255&MSPPError=-2147217396
27 мар 15, 10:43    [17438858]     Ответить | Цитировать Сообщить модератору
 Re: Передача параметра из одного курсора в другой  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
Асланали
Как это будет выглядеть не подскажите?

Вы случаем не ораклом ранее занимались:))
update ls
set ls.АдресЛС = ty.АдресТУ
from 
[Лицевые счета] ls
join [Лицевые договора] ld on ld.Лицевой = ls.ROW_ID 
join [Договор] d on ld.Договор = d.ROW_ID
join [tmpTY] ty on ty.[Номер] = d.Номер
where 
d._Участок = '316116036'
AND ld.ДатКнц > '20151231'
27 мар 15, 10:48    [17438876]     Ответить | Цитировать Сообщить модератору
 Re: Передача параметра из одного курсора в другой  [new]
Асланали
Member

Откуда: Республика Дагестан,Махачкала
Сообщений: 246
WarAnt
Вы случаем не ораклом ранее занимались:))

Именно :-)
27 мар 15, 10:49    [17438887]     Ответить | Цитировать Сообщить модератору
 Re: Передача параметра из одного курсора в другой  [new]
Асланали
Member

Откуда: Республика Дагестан,Махачкала
Сообщений: 246
Осваиваю потихоньку MSSQL
27 мар 15, 10:52    [17438899]     Ответить | Цитировать Сообщить модератору
 Re: Передача параметра из одного курсора в другой  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
WarAnt
AND ld.ДатКнц > '20151231'
Точнее
AND ld.ДатКнц >= '2016'
27 мар 15, 10:53    [17438908]     Ответить | Цитировать Сообщить модератору
 Re: Передача параметра из одного курсора в другой  [new]
Асланали
Member

Откуда: Республика Дагестан,Махачкала
Сообщений: 246
Спасибо большое, попробую.
27 мар 15, 10:54    [17438917]     Ответить | Цитировать Сообщить модератору
 Re: Передача параметра из одного курсора в другой  [new]
Glory
Member

Откуда:
Сообщений: 104751
Асланали
WarAnt
Вы случаем не ораклом ранее занимались:))

Именно :-)

А в Оракле нет джойнов ? Или UPDATE не позволяет использовать несколько таблиц ?
27 мар 15, 10:56    [17438945]     Ответить | Цитировать Сообщить модератору
 Re: Передача параметра из одного курсора в другой  [new]
Асланали
Member

Откуда: Республика Дагестан,Махачкала
Сообщений: 246
Glory
А в Оракле нет джойнов ? Или UPDATE не позволяет использовать несколько таблиц ?

Есть там все.
27 мар 15, 11:01    [17438990]     Ответить | Цитировать Сообщить модератору
 Re: Передача параметра из одного курсора в другой  [new]
Glory
Member

Откуда:
Сообщений: 104751
Асланали
Glory
А в Оракле нет джойнов ? Или UPDATE не позволяет использовать несколько таблиц ?

Есть там все.

И как бы тогда выглядел этот запрос на Oracle ?
27 мар 15, 11:05    [17439030]     Ответить | Цитировать Сообщить модератору
 Re: Передача параметра из одного курсора в другой  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
Glory
Асланали
пропущено...

Есть там все.

И как бы тогда выглядел этот запрос на Oracle ?


Там очень любят курсоры, у них курсоро мания:)
27 мар 15, 11:08    [17439049]     Ответить | Цитировать Сообщить модератору
 Re: Передача параметра из одного курсора в другой  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
iap
WarAnt
AND ld.ДатКнц > '20151231'
Точнее
AND ld.ДатКнц >= '2016'


можно и так но суть и план от этого не меняется.:)
27 мар 15, 11:08    [17439055]     Ответить | Цитировать Сообщить модератору
 Re: Передача параметра из одного курсора в другой  [new]
Асланали
Member

Откуда: Республика Дагестан,Махачкала
Сообщений: 246
Спасибо большое все ответившим. Работает.
Скажите пожалуйста, объясните.
Вы советуете редко использовать курсоры? Большая часть решается написанием стандартного SQL запроса без спецификаций языка T-SQL?.
27 мар 15, 11:31    [17439230]     Ответить | Цитировать Сообщить модератору
 Re: Передача параметра из одного курсора в другой  [new]
Glory
Member

Откуда:
Сообщений: 104751
Асланали
Большая часть решается написанием стандартного SQL запроса без спецификаций языка T-SQL?.

Разумеется.
27 мар 15, 11:33    [17439260]     Ответить | Цитировать Сообщить модератору
 Re: Передача параметра из одного курсора в другой  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
Асланали
Спасибо большое все ответившим. Работает.
Скажите пожалуйста, объясните.
Вы советуете редко использовать курсоры? Большая часть решается написанием стандартного SQL запроса без спецификаций языка T-SQL?.


я бы даже сказал так, НИКОГДА не использовать курсоры и очень редко использовать функции:) особенно скалярные.
27 мар 15, 11:42    [17439348]     Ответить | Цитировать Сообщить модератору
 Re: Передача параметра из одного курсора в другой  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
WarAnt
iap
пропущено...
Точнее
AND ld.ДатКнц >= '2016'



можно и так но суть и план от этого не меняется.:)
Суть меняется, ибо у Вас не отбрасывается целый день 31 декабря 2015 года, если в дате есть хоть какое-то ненулевое время.
27 мар 15, 11:52    [17439438]     Ответить | Цитировать Сообщить модератору
 Re: Передача параметра из одного курсора в другой  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
WarAnt
Асланали
Спасибо большое все ответившим. Работает.
Скажите пожалуйста, объясните.
Вы советуете редко использовать курсоры? Большая часть решается написанием стандартного SQL запроса без спецификаций языка T-SQL?.


я бы даже сказал так, НИКОГДА не использовать курсоры и очень редко использовать функции:) особенно скалярные.
Есть задачи, которые НАДО решать курсорами.
В некоторых случаях полезны табличные функции, особенно инлайновые.
27 мар 15, 11:54    [17439450]     Ответить | Цитировать Сообщить модератору
 Re: Передача параметра из одного курсора в другой  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
iap
WarAnt
пропущено...


можно и так но суть и план от этого не меняется.:)
Суть меняется, ибо у Вас не отбрасывается целый день 31 декабря 2015 года, если в дате есть хоть какое-то ненулевое время.


А да, проглядел, звиняюсь.
27 мар 15, 12:32    [17439786]     Ответить | Цитировать Сообщить модератору
 Re: Передача параметра из одного курсора в другой  [new]
Асланали
Member

Откуда: Республика Дагестан,Махачкала
Сообщений: 246
Понял Вас, спасибо!
27 мар 15, 13:30    [17440226]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить