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

Откуда: Одесса, Украина
Сообщений: 6089
Вечер добрый!
Нужен совет или помощь многоуважаемых гуру.
Имеем 2 сервера - локальный и удаленный, удаленный подключен как линкед-сервер с именем [BB-CLOUD]
Периодически из локального в удаленный происходит передача определенных данных, примерно вот таким куском процедуры:
declare  CursRealiz CURSOR for

SELECT Товар, Количество, Цена,  Скидка, CodeReal FROM Реализация WHERE (Накладная = @p1) 
	  
OPEN CursRealiz fetch next from CursRealiz INTO @r1, @r2, @r3, @r4, @r5

while (@@FETCH_STATUS =0)
	begin 
		execute [BB-CLOUD]...ExpPriemRealiz   @r1, @r2, @r3, @r4, @r5

		fetch next from CursRealiz INTO @r1, @r2, @r3, @r4, @r5
	end

close CursRealiz
deallocate CursRealiz

В 9 из 10 случаев (клиентов) процедура отрабатывает идеально.
Но вот уже несколько раз столкнулся с ситуацией, что процедура ExpPriemRealiz выполняется несколько раз подряд для одной единственной записи курсора. (она добавляет записи на удаленном сервере).
Такое впечатление, что по какой-то причине fetch next from CursRealiz просто не выполняется. Либо по непонятной мне причине execute выполняется несколько раз.

Есть какие-то соображения?

Заранее благодарен.
17 сен 15, 20:11    [18162935]     Ответить | Цитировать Сообщить модератору
 Re: Вызов удаленных процедур из курсора  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1836
Odess,

ну поинспектируйте запуск процедуры своей

if object_id('tbl_log') is not null drop table tbl_log
create table tbl_log(
    rowId int identity(1,1),
    batchid uniqueidentifier,
    fetch_id int
)


declare @batchid uniqueidentifier,
           @fetch_id int

set @batchid = newid()
set @fetch_id = 0

declare  CursRealiz CURSOR for

SELECT Товар, Количество, Цена,  Скидка, CodeReal FROM Реализация WHERE (Накладная = @p1) 
	  
OPEN CursRealiz fetch next from CursRealiz INTO @r1, @r2, @r3, @r4, @r5

while (@@FETCH_STATUS =0)
	begin 
                insert into tbl_log (batchid, fetch_id) values (@batchid, @fetch_id)

		execute [BB-CLOUD]...ExpPriemRealiz   @r1, @r2, @r3, @r4, @r5

                set @fetch_id = @fetch_id + 1
		fetch next from CursRealiz INTO @r1, @r2, @r3, @r4, @r5
	end

close CursRealiz
deallocate CursRealiz


и увидите сколько раз у вас выполняется процедура
количество строк в tbl_log по отдельному batchid должно сходиться с
SELECT count(1) FROM Реализация WHERE (Накладная = @p1) 
17 сен 15, 20:23    [18162965]     Ответить | Цитировать Сообщить модератору
 Re: Вызов удаленных процедур из курсора  [new]
Odess
Member

Откуда: Одесса, Украина
Сообщений: 6089
Спасибо, попробую.
Проблема в том, что данный эффект наблюдается не всегда, более того, удалив записи на удаленном и запустив ее по новой, она может нормально отработать.
Возможно причина в том, что удаленный сервер линкуется через интернет, хотя качество канала вроде неплохое, пинги небольшие. И явных ошибок я не наблюдал. Почему тогда процедура не прерывается, а выполняется несколько раз?
17 сен 15, 20:29    [18162978]     Ответить | Цитировать Сообщить модератору
 Re: Вызов удаленных процедур из курсора  [new]
Glory
Member

Откуда:
Сообщений: 104751
Odess
Есть какие-то соображения?

ваш курсор - динамический и отражает все изменения данных из всех других коннектов
17 сен 15, 20:32    [18162983]     Ответить | Цитировать Сообщить модератору
 Re: Вызов удаленных процедур из курсора  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1836
Odess,

врядли это проблема прокрутки курсора

хотелось бы видеть код ExpPriemRealiz
17 сен 15, 20:33    [18162989]     Ответить | Цитировать Сообщить модератору
 Re: Вызов удаленных процедур из курсора  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1836
кстати да, задайте курсор как STATIC
17 сен 15, 20:38    [18163002]     Ответить | Цитировать Сообщить модератору
 Re: Вызов удаленных процедур из курсора  [new]
Odess
Member

Откуда: Одесса, Украина
Сообщений: 6089
Простейшая процедура:

ALTER PROCEDURE [dbo].[ExpPriemRealiz]
(@r1 int, @r2 float, @r3 float, @r4 bit, @r5 int)

AS 
declare @code as bigint

	INSERT INTO [Реализация] (Товар, Количество, Цена, Скидка,  CodeRCl) SELECT @r1, @r2, @r3, @r4, @r5 

	Exec NewNaklTov @r5
17 сен 15, 20:39    [18163009]     Ответить | Цитировать Сообщить модератору
 Re: Вызов удаленных процедур из курсора  [new]
Odess
Member

Откуда: Одесса, Украина
Сообщений: 6089
felix_ff
кстати да, задайте курсор как STATIC

STATIC не пробовал. Пробовал INSENSITIVE, не помогло. Завтра STATIC попробую.
17 сен 15, 20:41    [18163011]     Ответить | Цитировать Сообщить модератору
 Re: Вызов удаленных процедур из курсора  [new]
@r1, @r2, @r3, @r4
Guest
Odess,

простейшая процедура, суть которой - вызов другой процедуры.
по ниточке, по буковке вытягивать что ли?

с чего вы взяли что несколько записей это результат нескольких вызовов, а не криво написанной вставки с каким-нибудь missing join predicate?

обработка ошибок - нигде ни в зачаточном даже состоянии
17 сен 15, 20:44    [18163015]     Ответить | Цитировать Сообщить модератору
 Re: Вызов удаленных процедур из курсора  [new]
Glory
Member

Откуда:
Сообщений: 104751
Odess
Простейшая процедура:

Надо не текст процедуры показывать, а логи выполнения, в которых видно, сколько раз был вызов и с какими параметрами
17 сен 15, 20:47    [18163027]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить