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

Откуда:
Сообщений: 969
Добрый день.
Есть ли какой-то способ отслеживания хода выполнения процедуры в случае с курсорами?

Условия: нагруженный сервер. Порядка 10 млн записей в главной таблице. Курсоры, увы, неизбежны в этой операции.
Из таблицы выбираются данные (ну скажем порядка 1000 - 10 000). Эти данные внутри курсора обрабатываются через хранимку. В хранимке по опр многочисленным условиям проставляются данные в эту и другие таблицы.
Поскольку главная таблица сильно нагружена, между каждой итерацией стоит waitFor delay '00:00:00.010'.
Время выполнения в таком случае сильно не играет (хотя при прочих равных все же имеет значение). Однако хотелось бы получать некоторые данные о ходе выполнения и иметь возможность (скажем) остановить выполнение (не обязательно).

Примерный код:
    declare CUR cursor local for
      select id,code from maintable with (nolock)
      where catalogueid=@catalogueid 
    Open cur
    fetch next from cur into @id,@code
    while @@FETCH_STATUS = 0
    begin
      exec UpdateMainSP @id=@id,@catalogueid=@catalogueid,@code=@code  -- delay внутри процедуры
      fetch next from cur into @id,@code
    end
    close cur
    deallocate cur 


Первое что приходит в голову: писать все количество во временную таблицу первой записью и второй записью обновлять значение в каждой итерации.
  -- create table #tmp (id int, cnt int)
  insert into #tmp  
  select 1,COUNT(*) from maintable where catalogueid=@catalogueid 
  insert into #tmp (id,cnt) value(2,0)
  declare CUR cursor local for
      select id,code from maintable with (nolock)
      where catalogueid=@catalogueid 
    Open cur
    fetch next from cur into @id,@code
    while @@FETCH_STATUS = 0
    begin
      set @cnt = @cnt + 1
      update #tmp set cnt = @cnt where id = 2
      exec UpdateMainSP @id=@id,@catalogueid=@catalogueid,@code=@code  -- delay внутри процедуры
      fetch next from cur into @id,@code
    end
    close cur
    deallocate cur
  -- drop table #tmp

Из внешней среды (скажем в интерфейсе из которого запускается процедура обработки) обращаться по таймеру к #tmp и проверять соотношение id = 1 и id = 2. Создать таким образом прогресс бар.

Но почему-то мне кажется, что есть какая-то более продвинутая и менее нагружающая вещь. Если знаете, поделитесь плиз.
Благодарю.
14 авг 12, 20:50    [13011532]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
_Промешан_
Member

Откуда:
Сообщений: 969
В дополнение: внутри хранимки тоже есть курсор. Там идет отбор по записям из других таблиц, многочисленные проверки и так далее.
Архитектура увы такая, учитывая, что кое-где почти пивоты.
14 авг 12, 20:53    [13011547]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
_Промешан_
Member

Откуда:
Сообщений: 969
Нет идей или сам вопрос идиотский?
15 авг 12, 13:30    [13014487]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
Glory
Member

Откуда:
Сообщений: 104760
Luke, use SET CONTEXT_INFO
15 авг 12, 13:33    [13014509]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
nicescar
Member

Откуда:
Сообщений: 94
_Промешан_,

Ну как бы временные таблицы из другой сессии не особо позапрашиваешь, надо тогда глобальную временную таблицу делать через ##.
Если нужен банальный прогресс бар, то можно просто в отдельную таблицу (пусть даже глобальную временную) писать номер шага.
В духе
create table ##tmp (a int)
insert into ##tmp values (1)
update ##tmp set a = a + 1
15 авг 12, 13:38    [13014547]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
_Промешан_
Member

Откуда:
Сообщений: 969
Glory
Luke, use SET CONTEXT_INFO

Thanks, sensei!

А как им воспользоваться в "контексте" моего вопроса.
Из хелпа я не очень понял, как можно, скажем, запустив два smss, в первом запустив запрос, а во втором получить это контекст_инфо? Наверное в двух разных конекшнах (делаю вывод) - нельзя.

Тогда может быть вы имели в виду запуск батча в асинхронном режиме, и по ходу курсора обновлять CONTEXT_INFO? А другим запросом (в том же конекшне) проверять значение? Растолкуйте.

nicescar , ну так я вроде и предложил такой метод. Только мне он кажется кощунственным. Ну разве что решетки перепутал (сначала там их было две) :)
15 авг 12, 13:52    [13014686]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
Glory
Member

Откуда:
Сообщений: 104760
_Промешан_
Из хелпа я не очень понял, как можно, скажем, запустив два smss, в первом запустив запрос, а во втором получить это контекст_инфо? Наверное в двух разных конекшнах (делаю вывод) - нельзя.

На чем основан этот вывод ?
Что мешает(кроме отсутсвия прав) в любом коннекте выполнить
SELECT context_info
FROM sys.dm_exec_sessions
WHERE session_id =<номер другого коннекта>
15 авг 12, 14:05    [13014844]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
_Промешан_
Member

Откуда:
Сообщений: 969
Glory
_Промешан_
Из хелпа я не очень понял, как можно, скажем, запустив два smss, в первом запустив запрос, а во втором получить это контекст_инфо? Наверное в двух разных конекшнах (делаю вывод) - нельзя.

На чем основан этот вывод ?
Что мешает(кроме отсутсвия прав) в любом коннекте выполнить
SELECT context_info
FROM sys.dm_exec_sessions
WHERE session_id =<номер другого коннекта>
В таком случае наверное и не надо SET context_info устанавливать. Верно?

А в одном коннекте (пока выполняется батч) можно послать другой запрос? В этом случае ведь он тоже будет относиться к текущему @@SPID.
15 авг 12, 15:31    [13015608]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
Glory
Member

Откуда:
Сообщений: 104760
_Промешан_
В таком случае наверное и не надо SET context_info устанавливать. Верно?

Если вы его не установите, то как собственно узнаете о прогрессе то ?


_Промешан_
А в одном коннекте (пока выполняется батч) можно послать другой запрос?

Нет
15 авг 12, 15:36    [13015630]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
_Промешан_
Member

Откуда:
Сообщений: 969
_Промешан_,

Да, и не вполне понятно какое поле там отвечает за "инкремент". Там же в основном суммируется по заданному @@SPID.
Единственное что там можно проверить статус со sleeping на running. А все остальные параметры обновляются только по завершении батча.
15 авг 12, 15:36    [13015638]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
_Промешан_
Member

Откуда:
Сообщений: 969
Glory
_Промешан_
В таком случае наверное и не надо SET context_info устанавливать. Верно?

Если вы его не установите, то как собственно узнаете о прогрессе то ?
По @@SPID, а разве нет? Судя по проставлению разных context - количество записей в результирующем наборе по session_id не меняется. И в этой записи остается последний использованный context для других батчей.

Так вот и о прогрессе то как узнать в итоге? Что то я не понял пока.
15 авг 12, 15:40    [13015668]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
Glory
Member

Откуда:
Сообщений: 104760
_Промешан_
По @@SPID, а разве нет?

Мда
Для того, чтобы "продать что-нибудь ненужное, надо сначала купить что-нибудь ненужное"
Если вы никуда ничего не занесете о прогрессе, что как @@SPID или еще что поможет прочитать информацию о прогрессе ?
15 авг 12, 15:43    [13015680]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
_Промешан_
Member

Откуда:
Сообщений: 969
Glory
_Промешан_
По @@SPID, а разве нет?

Мда
Для того, чтобы "продать что-нибудь ненужное, надо сначала купить что-нибудь ненужное"
Если вы никуда ничего не занесете о прогрессе, что как @@SPID или еще что поможет прочитать информацию о прогрессе ?

Ну так! Что и куда нужно заносить? Всмысле к чему вся эта прелесть про CONTEXT_INFO?
15 авг 12, 19:20    [13017195]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
_Промешан_
Member

Откуда:
Сообщений: 969
_Промешан_
Glory
пропущено...

Мда
Для того, чтобы "продать что-нибудь ненужное, надо сначала купить что-нибудь ненужное"
Если вы никуда ничего не занесете о прогрессе, что как @@SPID или еще что поможет прочитать информацию о прогрессе ?

Ну так! Что и куда нужно заносить? Всмысле к чему вся эта прелесть про CONTEXT_INFO?


Поправьте меня, если я не прав.
Вы предлагаете вносить инкремен в CONTEXT_INFO в течении курсора вместо занесения во времянку?
И если все так, второй вопрос - получается в курсоре мне надо будет ставить GO оператор, это значит что каждая итерация будет отдельным пакетом?
15 авг 12, 19:52    [13017270]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
invm
Member

Откуда: Москва
Сообщений: 9425
_Промешан_
Поправьте меня, если я не прав.
Вы предлагаете вносить инкремен в CONTEXT_INFO в течении курсора вместо занесения во времянку?
И если все так, второй вопрос - получается в курсоре мне надо будет ставить GO оператор, это значит что каждая итерация будет отдельным пакетом?
Откуда такой вывод? Ну и "GO-оператора" не существует.
15 авг 12, 20:08    [13017324]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
_Промешан_
Member

Откуда:
Сообщений: 969
invm
_Промешан_
Поправьте меня, если я не прав.
Вы предлагаете вносить инкремен в CONTEXT_INFO в течении курсора вместо занесения во времянку?
И если все так, второй вопрос - получается в курсоре мне надо будет ставить GO оператор, это значит что каждая итерация будет отдельным пакетом?
Откуда такой вывод? Ну и "GO-оператора" не существует.
даже незнаю чем мне ваш вопрос и комментарий помогает. Наверное ничем.
15 авг 12, 20:38    [13017439]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
_Промешан_
Member

Откуда:
Сообщений: 969
Эмпирическим путем я открыл, что в цикле
declare @a binary(128)=1
while @a < 100
begin
  set @a = @a + 1
  SET CONTEXT_INFO @a
  waitfor delay '00:00:00.200'
end

который занимает 20 секунд, проверка
select CAST(context_info as int), * from sys.dm_exec_sessions where session_id = 396


Не работает до тех пор, пока батч не завершится.

Скромно повторяю свой вопрос - какой смысл в CONTEXT_INFO применительно к вопросу автора?
15 авг 12, 20:41    [13017444]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
в тему
Guest
Получение прогресса выполнения хранимой процедуры
15 авг 12, 20:58    [13017499]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31470
_Промешан_
invm
пропущено...
Откуда такой вывод? Ну и "GO-оператора" не существует.
даже незнаю чем мне ваш вопрос и комментарий помогает. Наверное ничем.

_Промешан_
Не работает до тех пор, пока батч не завершится.
Можно точнее сказать - "не работает" - это какой то номер ошибк, или ещё что то?

Совсем непонятно, что у вас не получается, вам уже практически код написали.
_Промешан_
даже незнаю чем мне ваш вопрос и комментарий помогает
Ну, вопросы обычно не помогают, они спрашивают :-)

Комментарий поможет понять, что такое GO, и как странно звучит фраза "получается в курсоре мне надо будет ставить GO оператор"

Это всё равно что сказать "получается в умножении мне надо будет файл поставить".
15 авг 12, 21:46    [13017651]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
_Промешан_
Member

Откуда:
Сообщений: 969
alexeyvg
_Промешан_
пропущено...
даже незнаю чем мне ваш вопрос и комментарий помогает. Наверное ничем.

_Промешан_
Не работает до тех пор, пока батч не завершится.
Можно точнее сказать - "не работает" - это какой то номер ошибк, или ещё что то?

"не работает" - это значит что пока выполняется первый запрос (цикл), в другом окне я судорожно нажимаю F5 с введенным запросом (См выше) и "чуда" не случается, то есть CONTEXT_INFO остается прежним значением (то есть до начала цикла).
но когда первый код завершается, тогда да, я вижу изменения - CONTEXT_INFO становится равно 99. До этого, оно равно 0.
16 авг 12, 12:47    [13019780]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
_Промешан_
Member

Откуда:
Сообщений: 969
в тему
Получение прогресса выполнения хранимой процедуры


Интересно.
Вот если использовать этот код:
select spid, cast(context_info as varchar) from  master..sysprocesses where spid = NNN

То все работает и обновляется.
А вот этот, что дал Глори в моем топике, не работает
SELECT context_info
FROM sys.dm_exec_sessions
WHERE session_id =<номер другого коннекта> 

Интересно почему?
16 авг 12, 12:57    [13019869]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
nicescar
Member

Откуда:
Сообщений: 94
_Промешан_,

может, разрешения на sysprocesses и на DMV разные нужны?
На DMV точно нужен VIEW SERVER STATE.
16 авг 12, 13:23    [13020090]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
_Промешан_
Member

Откуда:
Сообщений: 969
nicescar
_Промешан_,

может, разрешения на sysprocesses и на DMV разные нужны?
На DMV точно нужен VIEW SERVER STATE.

А у вас работает оба кода проверки?


пс: что бы теперь такого написать в курсоре, что бы можно было процесс прервать извне? Теоретически можно было бы проставить CONTEXT_INFO, скажем в -1 и проверять в курсоре/цикле. Но вдруг что еще есть интересное (что бы не затрачивать время на дополнительный селект)?
16 авг 12, 13:59    [13020446]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
nicescar
Member

Откуда:
Сообщений: 94
_Промешан_
А у вас работает оба кода проверки?

Да, только в первом случае возвращается varchar, во втором - varbinary.
16 авг 12, 14:09    [13020540]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
_Промешан_
Member

Откуда:
Сообщений: 969
nicescar
_Промешан_
А у вас работает оба кода проверки?

Да, только в первом случае возвращается varchar, во втором - varbinary.

Хм... любопытно.
А какое нужно право выдать, что бы у мог dm смотреть во время выполнения процесса, а не по его завершению? Точнее что бы обновлялся контекст?
16 авг 12, 14:11    [13020557]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
nicescar
Member

Откуда:
Сообщений: 94
_Промешан_,

VIEW SERVER STATE, больше ничего не надо..
Не понял про "во время выполнения", context_info обновляется сразу, не дожидаясь завершения транзакции..
16 авг 12, 14:14    [13020582]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
_Промешан_
Member

Откуда:
Сообщений: 969
nicescar
_Промешан_,

VIEW SERVER STATE, больше ничего не надо..
Не понял про "во время выполнения", context_info обновляется сразу, не дожидаясь завершения транзакции..
Посредством GRANT ON DM... to USER?


"во время выполнения". Давайте оббратимся к запросу с циклом. Пока идет цикл, я подразумеваю что это процесс "выполнения" запроса. То есть батч выполняется. Скажем 20 секунд.
Так вот за это время, в другом SMSS, селект по dm_exec_sessions дает context_info = 0. А селект по master..sysprocesses показывает реальный прогресс (то есть значение меняется) во время выполнения батча (цикл while .... с waitfor delay, который в последних сообщениях представлен).
16 авг 12, 16:17    [13021645]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
nicescar
Member

Откуда:
Сообщений: 94
автор
Посредством GRANT ON DM... to USER?

grant view server state to [login_name]
16 авг 12, 16:19    [13021656]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
_Промешан_
Member

Откуда:
Сообщений: 969
nicescar
автор
Посредством GRANT ON DM... to USER?

grant view server state to [login_name]
Попробуем, как права дадут.

А как бы обработать прерывание выполнения? Покрасивше?
16 авг 12, 17:12    [13022118]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
фигня какая-то
Guest
_Промешан_
А какое нужно право выдать, что бы у мог dm смотреть во время выполнения процесса, а не по его завершению? Точнее что бы обновлялся контекст?


если права не отбирают/выдают каждую секунду,
а Вы по завершении цикла видите 99 в dm_exec_sessions из другой сессии,
то права на dm_exec_sessions у Вас и так есть.

зато фигня с необновлением dm_exec_sessions у меня воспроизводится

spid = 63:
declare @a binary(128)=1
while @a < 100
begin
  set @a = @a + 1
  SET CONTEXT_INFO @a
  waitfor delay '00:00:00.200'
end


в соседней сессии:

declare @a int=1
while @a < 500
begin
    set @a = @a + 1
    
	select spid, CAST(context_info as int) 
	from  master..sysprocesses where spid = 63
	
    select CAST(context_info as int)
	from sys.dm_exec_sessions where session_id = 63	
end


в sysprocesses context_info обновляется, а в dm_exec_sessions висит неизменная сотня
16 авг 12, 17:50    [13022375]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
_Промешан_
Member

Откуда:
Сообщений: 969
фигня какая-то
_Промешан_
А какое нужно право выдать, что бы у мог dm смотреть во время выполнения процесса, а не по его завершению? Точнее что бы обновлялся контекст?


если права не отбирают/выдают каждую секунду,
а Вы по завершении цикла видите 99 в dm_exec_sessions из другой сессии,
то права на dm_exec_sessions у Вас и так есть.

зато фигня с необновлением dm_exec_sessions у меня воспроизводится

spid = 63:
+
declare @a binary(128)=1
while @a < 100
begin
  set @a = @a + 1
  SET CONTEXT_INFO @a
  waitfor delay '00:00:00.200'
end


в соседней сессии:

+
declare @a int=1
while @a < 500
begin
    set @a = @a + 1
    
	select spid, CAST(context_info as int) 
	from  master..sysprocesses where spid = 63
	
    select CAST(context_info as int)
	from sys.dm_exec_sessions where session_id = 63	
end


в sysprocesses context_info обновляется, а в dm_exec_sessions висит неизменная сотня
Вот и я о том же.
А может Glory это специально, чтобы проверить а есть ли глюки еще у кого-то с этой процедурой? :)

А какие права нужны для master..sysprocesses? щас вот думаю обычные пользователи могут ли пользоваться процедурами, в которых SET CONTEXT_INFO и еще заодно чтение прогресса...

Чую дело пахнет керосином и надо будет тупо писать в темповую таблицу. (один ведь хрен пишется в таблицу). По сути выигрыша никакого?
16 авг 12, 18:47    [13022672]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
qwerty112
Guest
_Промешан_
Чую дело пахнет керосином и надо будет тупо писать в темповую таблицу. (один ведь хрен пишется в таблицу). По сути выигрыша никакого?

так, а вариант с этого поста 13017499 , конкретно, тот пример куда ведёт ссылка (с SQLDMO.SQLServer2 ) - не устраивает ?
"им" сообщения с raiserror - "ловятся" на раз ..
16 авг 12, 18:55    [13022706]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
фигня какая-то
в sysprocesses context_info обновляется, а в dm_exec_sessions висит неизменная сотня
Прикольная оптимизация. Context_Info обновляется для dm_exec_sessions только после взаимодействия с клиентом. Т.е. это работает нормально:
DECLARE @UI UniqueIdentifier = NewID()
SET CONTEXT_INFO @UI
WAITFOR DELAY '00:00:00.200'
GO 100
Мол юзать её как глобальную переменную не кошерно.
16 авг 12, 18:56    [13022714]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
_Промешан_
Member

Откуда:
Сообщений: 969
qwerty112
_Промешан_
Чую дело пахнет керосином и надо будет тупо писать в темповую таблицу. (один ведь хрен пишется в таблицу). По сути выигрыша никакого?

так, а вариант с этого поста 13017499 , конкретно, тот пример куда ведёт ссылка (с SQLDMO.SQLServer2 ) - не устраивает ?
"им" сообщения с raiserror - "ловятся" на раз ..
У нас SDAC. А умеет ли так SDAC - я не знаю.
16 авг 12, 20:05    [13022979]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
_Промешан_
Member

Откуда:
Сообщений: 969
Mnior
фигня какая-то
в sysprocesses context_info обновляется, а в dm_exec_sessions висит неизменная сотня
Прикольная оптимизация. Context_Info обновляется для dm_exec_sessions только после взаимодействия с клиентом. Т.е. это работает нормально:
DECLARE @UI UniqueIdentifier = NewID()
SET CONTEXT_INFO @UI
WAITFOR DELAY '00:00:00.200'
GO 100
Мол юзать её как глобальную переменную не кошерно.
Почему?
16 авг 12, 20:06    [13022987]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
edyaN
Member

Откуда:
Сообщений: 185
_Промешан_,
BOL
Предпочтительным способом для получения контекстных данных по текущему сеансу является использование функции CONTEXT_INFO. Контекстные данные по сеансу также хранятся в столбцах context_info следующих системных представлений:

sys.dm_exec_requests
sys.dm_exec_sessions
sys.sysprocesses


в sys.dm_exec_requests все обновляется.

SELECT context_info , cast(context_info as int)
FROM sys.dm_exec_requests
WHERE session_id = XXX;
16 авг 12, 20:28    [13023063]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
edyaN
в sys.dm_exec_requests все обновляется
Мужики, но вы то версии скуля выкладывайте.
А то словно "криворукие вы все, не можете нормально банально компильнуть SQL из исходников".
16 авг 12, 21:34    [13023293]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31470
_Промешан_
Чую дело пахнет керосином и надо будет тупо писать в темповую таблицу. (один ведь хрен пишется в таблицу). По сути выигрыша никакого?
темповая таблица будет блокироваться в транзакции...

Конечно, читать её можно с nolock, но несколько процессов писать туда не смогут.
_Промешан_
"не работает" - это значит что пока выполняется первый запрос (цикл), в другом окне я судорожно нажимаю F5 с введенным запросом (См выше) и "чуда" не случается, то есть CONTEXT_INFO остается прежним значением (то есть до начала цикла).
Да, интересная особенность sys.dm_exec_sessions по сравнению с master..sysprocesses, не знал.

Сам я всегда, много лет, использовал для получения этих данных функцию CONTEXT_INFO()
16 авг 12, 21:59    [13023394]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
_Промешан_
Mnior
Мол юзать её как глобальную переменную не кошерно.
Почему?
Ну, "не работает" же.
А вооще вроде как название говорит само за себя.
Вот что пишет BOL.
BOL
Сведения о контексте сеанса могут быть использованы для хранения сведений, специфических для каждого пользователя или текущего состояния приложения.
Т.е. никто на запрещает и для временной задачи можно.
BOL
Новое значение не распространяется на представление sys.dm_exec_sessions до тех пор, пока выполнение пакета, содержащего инструкцию SET CONTEXT_INFO, не будет завершено.
Так что edyaN или лукавит или баг.

И вообще в задачу не вкуриваю, чем не катит?:
RaisError('%d',1,1,@Progress) WITH NoWait;
Ну а прервать наличием некоторой константы в таблице/вьюхе.

Мне кажется ТС просто вломы переписать оную процедуру.
Сегодня ты можешь "выровнять" одну процедуру за семь дней, завтра семь за один день.
16 авг 12, 22:10    [13023459]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
edyaN
Member

Откуда:
Сообщений: 185
Mnior
BOL
Новое значение не распространяется на представление sys.dm_exec_sessions до тех пор, пока выполнение пакета, содержащего инструкцию SET CONTEXT_INFO, не будет завершено.
Так что edyaN или лукавит или баг.


ну вообще-то то, что я написал не противоречит процитированному.
данные в sys.dm_exec_sessions обновляются после завершения пакета, а в sys.dm_exec_requests сразу же. То есть если смотреть в sys.dm_exec_requests, то можно увидеть прогресс выполнения.

Microsoft SQL Server 2005 - 9.00.3042.00 (Intel X86) Feb 9 2007 22:47:07 Copyright (c) 1988-2005 Microsoft Corporation Enterprise Edition on Windows NT 5.2 (Build 3790: Service Pack 2)
17 авг 12, 12:25    [13025759]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
edyaN
ну вообще-то то, что я написал не противоречит процитированному.
Ну вообще-то противоречит общему диалогу и смыслу.
Для чего вы вообще написали?: 13023063
Видимо как ответ на это: 13022375
WHILE (и использование в задаче ТС) не подразумевает старт и окончание пакета в цикле. =)

Ну, тогда OK, у всех работает одинаково, как описано в BOL.
17 авг 12, 17:10    [13028198]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
_Промешан_
Member

Откуда:
Сообщений: 969
alexeyvg

может WITH (READUNCOMMITTED) спасет?
С темповой таблицей потребуется не только обновлять и прочитывать из "долгоиграющего запроса с курсором", но так же из другой сессии прочитывать и обновлять эту темповую таблицу.
Полагаю было бы бессмысленным наличие глобальных темп-таблиц, если бы ими нельзя было бы пользоваться из другого конекта во время транзакции. У глобальных такое же поведение (по идее) как и у обычных таблиц.

Mnior похоже наш Glory в самом начале просто ввел всех в заблуждение и использовать надо вместо dm_exec_sessions - dm_exec_requests.

Ну а прервать наличием некоторой константы в таблице/вьюхе.

Мне кажется ТС просто вломы переписать оную процедуру.
Сегодня ты можешь "выровнять" одну процедуру за семь дней, завтра семь за один день.
Учитывая ту тему, в которой описывается использование райз ерроров - это работает только для SQLDMO. А у соединяюсь четез SDAC. У меня обычный эррор вызовет либо натуральную ошибку и прерывание (в случае от 16 и выше).

Впрочем надо попробовать. Вроде бы перехватчик ошибок в компоненте Connection есть. Только вот мне кажется что ошибку он както по своему выдает.

Но остается вопрос - как передать выполняющейся ХПшке сигнал о прекращении деятельности?
17 авг 12, 17:49    [13028356]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31470
_Промешан_
Mnior похоже наш Glory в самом начале просто ввел всех в заблуждение и использовать надо вместо dm_exec_sessions - dm_exec_requests.
Можно ещё использовать sysprocessed.

_Промешан_
alexeyvg

может WITH (READUNCOMMITTED) спасет?
С темповой таблицей потребуется не только обновлять и прочитывать из "долгоиграющего запроса с курсором", но так же из другой сессии прочитывать и обновлять эту темповую таблицу.
Полагаю было бы бессмысленным наличие глобальных темп-таблиц, если бы ими нельзя было бы пользоваться из другого конекта во время транзакции. У глобальных такое же поведение (по идее) как и у обычных таблиц.
Читать то их можно, но вот записать не получится.

Теоретически есть блокировка на уровне строк, но там так много ограничений...
17 авг 12, 17:54    [13028389]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31470
_Промешан_
Но остается вопрос - как передать выполняющейся ХПшке сигнал о прекращении деятельности?
Либо, как писали, использовать таблицу для этих сигналов, либо убить коннект.
17 авг 12, 17:55    [13028400]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
_Промешан_
использование райз ерроров - это работает только для SQLDMO. А у соединяюсь четез SDAC.
Обычный PRINT вываливается?
Не верю! ©
17 авг 12, 22:17    [13029319]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
_Промешан_
Member

Откуда:
Сообщений: 969
Mnior
_Промешан_
использование райз ерроров - это работает только для SQLDMO. А у соединяюсь четез SDAC.
Обычный PRINT вываливается?
Не верю! ©
Ну вы читали по ссылке? Там проблема возникает в том, что мессаджи не иммедиэйт, а накапливаются. проверять не стал. Ну и как бы убить коннект в этом случае не получится.

Решил пойти стопами глобальных темп таблиц, т.к. других пока решений не увидел (в том числе что бы остановить можно было процедуру - как можно убить процесс в том же коннекте? )
На входе создается глобальная темп таблица с одним полем и одной записью, которое обновляется в цикле.
Остановка процедуры происходит при удалении этой таблицы. Соответственно действие остановки - дроп таблицы. В цикле на обновление темп-табл стоит трай-кетч и в кетче выходим из процедуры return -1.

Я при проверке на ADO (с SQL Native Client драйвером), в одном коннекте смог запустить асинхронно без возврата результа процедуру (то есть возвращается контроль к интерфейсу) и в этом же коннекте можно проверять и удалять темп-таблицу. Ну как бы работает.

Если есть другие варианты (детально если можно) - велкам.
20 авг 12, 17:42    [13038563]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
_Промешан_
Mnior
Обычный PRINT вываливается?
Не верю! ©
Ну вы читали по ссылке? Там проблема возникает в том, что мессаджи не иммедиэйт, а накапливаются. проверять не стал.
Ани просто не имеют его готовить. Это не свойство PRINT это свойство всех сообщений. Но чтобы отсылалось немедленно, поэтому я и написал выше:
Mnior
RaisError('%d',1,1,@Progress) WITH NoWait;
Проглазели?

PS: Для тех кто в танке, PRINT и RaisError(,1,1) - одно и тоже.
20 авг 12, 21:36    [13039612]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
invm
Member

Откуда: Москва
Сообщений: 9425
Mnior
PS: Для тех кто в танке, PRINT и RaisError(,1,1) - одно и тоже.
Немного уточню:
raiserror('Message', -1, 1);
20 авг 12, 22:09    [13039756]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
invm
raiserror('Message', -1, 1);
Надо же.
21 авг 12, 14:02    [13043083]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
_Промешан_
Member

Откуда:
Сообщений: 969
Mnior
_Промешан_
пропущено...
Ну вы читали по ссылке? Там проблема возникает в том, что мессаджи не иммедиэйт, а накапливаются. проверять не стал.
Ани просто не имеют его готовить. Это не свойство PRINT это свойство всех сообщений. Но чтобы отсылалось немедленно, поэтому я и написал выше:
Mnior
RaisError('%d',1,1,@Progress) WITH NoWait;
Проглазели?

PS: Для тех кто в танке, PRINT и RaisError(,1,1) - одно и тоже.
В общем тут почитайте 173816 и не проглазейте.

И еще не проглазейте мой вопрос: как остановить выполнение цикла?
21 авг 12, 15:13    [13043773]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
_Промешан_
Mnior
пропущено...
Ани просто не имеют его готовить. Это не свойство PRINT это свойство всех сообщений. Но чтобы отсылалось немедленно, поэтому я и написал выше:
пропущено...
Проглазели?
В общем тут почитайте 173816 и не проглазейте.
Ну вы и тормоз. Потому что я читал ту ссылку, поэтому я и написал, что ани (т.е. thyrstydog) не знают как работают сообщения. И поэтому надо писать WITH NoWait. Но до вас не допирает что такое no wait.

_Промешан_
И еще не проглазейте мой вопрос: как остановить выполнение цикла?
Вам уже написали.
И я тоже, но вы то слепой.
Mnior
Ну а прервать наличием некоторой константы в таблице/вьюхе.
Но сейчас обидится и не будет пользоваться данными механизмами, типа в отместку :D
21 авг 12, 21:48    [13045883]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
_Промешан_
Member

Откуда:
Сообщений: 969
Mnior
_Промешан_
пропущено...
В общем тут почитайте 173816 и не проглазейте.
Ну вы и тормоз. Потому что я читал ту ссылку, поэтому я и написал, что ани (т.е. thyrstydog) не знают как работают сообщения. И поэтому надо писать WITH NoWait. Но до вас не допирает что такое no wait.

_Промешан_
И еще не проглазейте мой вопрос: как остановить выполнение цикла?
Вам уже написали.
И я тоже, но вы то слепой.
Mnior
Ну а прервать наличием некоторой константы в таблице/вьюхе.
Но сейчас обидится и не будет пользоваться данными механизмами, типа в отместку :D

А вы завязывайте со "скоростью" и кучей кофе. И на медленной (а точнее нормальной скоростью) начнете замечать окружающие вас вещи, людей, в том числе вот это 147592 из того же топика, который, как вы утверждаете "я читал ту ссылку". Возникает вопрос - не умеют готовить или может вы читать не умете? Вы сами-то попробовали, прежде чем предложить или так, чисто теоретически?


Смысла в райзерроре не вижу, если все равно надо пользовать таблицу. Вот если бы можно было без таблицы, тогда это большой смысл, т.к. план выполнения на неск процентов выиграет.

пс: ну вы это, снимите с газа-то. Хорош уже.
22 авг 12, 13:36    [13048945]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
_Промешан_
Возникает вопрос - не умеют готовить или может вы читать не умете?
Ну да, при использовании PRINT нельзя указать WITH NoWait, соответственно наблюдаются "особенности" поведения. Если написать PRINT через RAISERROR с указанной директивой то, указанного наблюдаться не будет.
_Промешан_
Вы сами-то попробовали, прежде чем предложить или так, чисто теоретически?
Если бы вы сами попробовали, то вы бы не стали ссылать на тот ничего не говорящий пост.
А так и написали "Попробовал WITH NOWAIT - не работает" и я тогда бы я потребовал привести код.
_Промешан_
Смысла в райзерроре не вижу, если все равно надо пользовать таблицу.
Естественно, если он решает другую задачу - уведомление хода проведения процесса.
_Промешан_
Вот если бы можно было без таблицы, тогда это большой смысл, т.к. план выполнения на неск процентов выиграет.
С чего вы это решили?
Зачем вы делаете проблемы на ровном месте.
Если надо контролить выполнение цикла, то ставите в нём проверку на существование (объекта, записи, константы - совершенно неважно) и всё. Чё парится то? Тип проверки на скорость не влияет совершенно, а само наличие необходимо в постановке задачи.
22 авг 12, 17:10    [13050828]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
invm
Member

Откуда: Москва
Сообщений: 9425
_Промешан_,

Как в вашем коде (курсор + вызов процедуры в цикле) обеспечивается целостность данных?
22 авг 12, 17:17    [13050874]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
_Промешан_
Member

Откуда:
Сообщений: 969
Mnior
_Промешан_
Возникает вопрос - не умеют готовить или может вы читать не умете?
Ну да, при использовании PRINT нельзя указать WITH NoWait, соответственно наблюдаются "особенности" поведения. Если написать PRINT через RAISERROR с указанной директивой то, указанного наблюдаться не будет.
_Промешан_
Вы сами-то попробовали, прежде чем предложить или так, чисто теоретически?
Если бы вы сами попробовали, то вы бы не стали ссылать на тот ничего не говорящий пост.
А так и написали "Попробовал WITH NOWAIT - не работает" и я тогда бы я потребовал привести код.
_Промешан_
Смысла в райзерроре не вижу, если все равно надо пользовать таблицу.
Естественно, если он решает другую задачу - уведомление хода проведения процесса.
_Промешан_
Вот если бы можно было без таблицы, тогда это большой смысл, т.к. план выполнения на неск процентов выиграет.
С чего вы это решили?
Зачем вы делаете проблемы на ровном месте.
Если надо контролить выполнение цикла, то ставите в нём проверку на существование (объекта, записи, константы - совершенно неважно) и всё. Чё парится то? Тип проверки на скорость не влияет совершенно, а само наличие необходимо в постановке задачи.
Ну в том и дело, что там написано про RAISERROR в комбинации с nowait. ну тем не менее, по счастью, в SDAC все работает отлично.
Если есть проверка существования, ну скажем, таблицы, или записи в некоторой таблице, то там же в ней можно и таймер накручивать. Тогда можно и без райзэррора обойтись. Но с другой стороны лучше от этого не станет.
Вот думаю, как советовали, может проще (хотя и менее безопасно) убивать процесс. Но тогда нужны будут сусдба права, я так понимаю, любому пользователю.

Как в вашем коде (курсор + вызов процедуры в цикле) обеспечивается целостность данных?

Почти никак. Этого впринципе достичь не удастся, поскольку данных очень много и ждать чистого чтения нам некогда.
А есть идеи, что бы не было простоя?
22 авг 12, 18:26    [13051327]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
invm
Member

Откуда: Москва
Сообщений: 9425
_Промешан_
Как в вашем коде (курсор + вызов процедуры в цикле) обеспечивается целостность данных?

Почти никак. Этого впринципе достичь не удастся, поскольку данных очень много и ждать чистого чтения нам некогда.
Причем здесь количество данных и какое-то "чистое" чтение? Вы понимаете, что такое целостность (согласованность) данных?
Так вот, что будет с этой самой целостностью, если соединение будет убито на выполнении UpdateMainSP?
Кстати, что для вас "чистое" чтение? Когда нет конкурирующих операций записи? Ну так есть средства обеспечить такое поведение.
_Промешан_
А есть идеи, что бы не было простоя?
Что бы не было простоя, нужно бороться с причиной оного, а не со следствием, а именно привести схему БД в порядок и отказаться от работы с ней циклами да курсорами.
22 авг 12, 20:03    [13051697]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
_Промешан_
Member

Откуда:
Сообщений: 969
invm
_Промешан_
пропущено...

Почти никак. Этого впринципе достичь не удастся, поскольку данных очень много и ждать чистого чтения нам некогда.
Причем здесь количество данных и какое-то "чистое" чтение? Вы понимаете, что такое целостность (согласованность) данных?
Так вот, что будет с этой самой целостностью, если соединение будет убито на выполнении UpdateMainSP?
Кстати, что для вас "чистое" чтение? Когда нет конкурирующих операций записи? Ну так есть средства обеспечить такое поведение.
_Промешан_
А есть идеи, что бы не было простоя?
Что бы не было простоя, нужно бороться с причиной оного, а не со следствием, а именно привести схему БД в порядок и отказаться от работы с ней циклами да курсорами.
Ах в этом смысле.
Процедура устроена так, что с целостностью все ок в случае прерывания табличным методом, т.к. проверка существования таблицы-прогресса стоит после выполнения всех нужных процессов над одной единицей данных.
А вот в случае убиения процесса - да, будет косяк.
22 авг 12, 20:20    [13051734]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
_Промешан_
Member

Откуда:
Сообщений: 969
Что бы не было простоя, нужно бороться с причиной оного, а не со следствием, а именно привести схему БД в порядок и отказаться от работы с ней циклами да курсорами.

Нет такой возможности.
Нельзя будет выполнить то, что заложено в этой процедуре одним или несколькими запросами. Поэтому во всех местах, где возможно (на сколько мне известно) курсор убран, в тех же, где этого логически никак не сделать - оставлен.

Но я не теряю надежду, что можно привести проставление произвольного количества параметров к произвольному количеству товаров посредством одного или нескольких запросов без циклов.
22 авг 12, 20:26    [13051754]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
invm
Member

Откуда: Москва
Сообщений: 9425
_Промешан_
Что бы не было простоя, нужно бороться с причиной оного, а не со следствием, а именно привести схему БД в порядок и отказаться от работы с ней циклами да курсорами.

Нет такой возможности.
Нельзя будет выполнить то, что заложено в этой процедуре одним или несколькими запросами. Поэтому во всех местах, где возможно (на сколько мне известно) курсор убран, в тех же, где этого логически никак не сделать - оставлен.
Откуда такая категоричность?

_Промешан_
Но я не теряю надежду, что можно привести проставление произвольного количества параметров к произвольному количеству товаров посредством одного или нескольких запросов без циклов.
п.п. 4 и 6
22 авг 12, 21:47    [13052003]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
_Промешан_
Member

Откуда:
Сообщений: 969
invm
_Промешан_
пропущено...

Нет такой возможности.
Нельзя будет выполнить то, что заложено в этой процедуре одним или несколькими запросами. Поэтому во всех местах, где возможно (на сколько мне известно) курсор убран, в тех же, где этого логически никак не сделать - оставлен.
Откуда такая категоричность?

_Промешан_
Но я не теряю надежду, что можно привести проставление произвольного количества параметров к произвольному количеству товаров посредством одного или нескольких запросов без циклов.
п.п. 4 и 6
насчет п.4 согласен. косяк.
п.6 - данный топик связан вот с этим 13039253. Здесь есть описание.
За исключением того, что как там описано Tools имеет параметры не только в таблице, но и в других таблицах (у одного товара может быть 300 параметров - это конечно клиника, но к тому, что они не хранятся вместе с таблицей Tools).

Категоричность из опыта. Но надежду я не теряю.
23 авг 12, 18:56    [13057154]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
_Промешан_
Member

Откуда:
Сообщений: 969
по пп 4

Microsoft SQL Server 2008 (SP3) - 10.0.5500.0 (X64)   Sep 21 2011 22:45:45   Copyright (c) 1988-2008 Microsoft Corporation  Standard Edition (64-bit) on Windows NT 6.0 <X64> (Build 6002: Service Pack 2) 
23 авг 12, 18:56    [13057158]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
invm
Member

Откуда: Москва
Сообщений: 9425
_Промешан_,

Каким образом 13039253 связан с задачей
_Промешан_
Но я не теряю надежду, что можно привести проставление произвольного количества параметров к произвольному количеству товаров посредством одного или нескольких запросов без циклов.
?
23 авг 12, 20:11    [13057327]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
_Промешан_
Member

Откуда:
Сообщений: 969
invm
_Промешан_,

Каким образом 13039253 связан с задачей
_Промешан_
Но я не теряю надежду, что можно привести проставление произвольного количества параметров к произвольному количеству товаров посредством одного или нескольких запросов без циклов.
?
Вот таким 13057243

Это означает, что есть таблица товаров, в которой есть поля, которые надо проставить, и несколько дополнительных таблиц, которые ссылаются на таблицу товаров и хранят в себе параметры товара.
Кроме этого, есть таблица масок, по которой необходимо проставить эти параметры к каждому товару, который подходит по маске.

Есть идеи как это реализовать без цикла?
25 авг 12, 14:00    [13063670]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
invm
Member

Откуда: Москва
Сообщений: 9425
_Промешан_,

Ну если ни схем таблиц, ни тестовых данных, ни желаемого результата вы предоставлять не желаете, то что вы от нас хотите?
Телепаты сюда не заходят.
25 авг 12, 15:10    [13063797]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
Serg_77m
Member

Откуда: Донецк
Сообщений: 237
_Промешан_
Это означает, что есть таблица товаров, в которой есть поля, которые надо проставить, и несколько дополнительных таблиц, которые ссылаются на таблицу товаров и хранят в себе параметры товара.
Кроме этого, есть таблица масок, по которой необходимо проставить эти параметры к каждому товару, который подходит по маске.

Есть идеи как это реализовать без цикла?
Чего-то я не понимаю, зачем здесь цикл.
Ну написать последовательно столько запросов, сколько всего таблиц с параметрами. Запросов вида:
insert into ПараметрыТоваров (...)
select a.id,c.*
from ТаблицаТоваров a
  inner join ТаблицаМасок b on a.код like b.маска
  inner join Параметры c on c.id=b.id
Может быть, для того, чтобы не записывать все параметры сразу (если их там миллионы), а потихоньку добавлять в цикле, чтобы сервер не упал?
25 авг 12, 15:12    [13063804]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
_Промешан_
Member

Откуда:
Сообщений: 969
Serg_77m
_Промешан_
Это означает, что есть таблица товаров, в которой есть поля, которые надо проставить, и несколько дополнительных таблиц, которые ссылаются на таблицу товаров и хранят в себе параметры товара.
Кроме этого, есть таблица масок, по которой необходимо проставить эти параметры к каждому товару, который подходит по маске.

Есть идеи как это реализовать без цикла?
Чего-то я не понимаю, зачем здесь цикл.
Ну написать последовательно столько запросов, сколько всего таблиц с параметрами. Запросов вида:
insert into ПараметрыТоваров (...)
select a.id,c.*
from ТаблицаТоваров a
  inner join ТаблицаМасок b on a.код like b.маска
  inner join Параметры c on c.id=b.id
Может быть, для того, чтобы не записывать все параметры сразу (если их там миллионы), а потихоньку добавлять в цикле, чтобы сервер не упал?
Разумеется и не без этого.
Плюс там еще есть пересчеты различные на главную таблицу замапленные.
А в таблице масок находится след инфа: тип параметра, ид параметра, значение параметра.
Типов параметров (то есть буквально varchar, bit, int, float) - 6 штук. Есть еще параметры типа один ко многим (то есть когда галочками проставлено). Плюс в зависимости от типа параметра, данные проставляются в ту или иную таблицу. То есть есть параметры которые добавляются в ТаблицуПараметров. А есть, которые проставляются в Товары. И простым CASE тут не отделаешься.
Может конечно есть какие-то изощренные варианты перечислений, но я таких не знаю. Да и тем более тут все равно предлагают рефакторинг делать.
27 авг 12, 18:36    [13071947]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
_Промешан_
Member

Откуда:
Сообщений: 969
invm
_Промешан_,

Ну если ни схем таблиц, ни тестовых данных, ни желаемого результата вы предоставлять не желаете, то что вы от нас хотите?
Телепаты сюда не заходят.

-- товары
Tools (ToolsId int, Name varchar(200), bitFlag int, Width float, Length float, MinimalQuantity int, DescriptionId int, AdditionalDescId)
-- набор параметров
Params(Name varchar(200), ParamsId smallint, ParamTypeId smallint);
-- набор значений параметров в связке с товарами
ParamValue (ParamValueId int,ToolsId int,ParamsId smallint, IntValue int, FloatValue float, StrValue varchar(255), ComboboxValueId int);
-- набор значений для комбобоксов и групповых селекторов
ComboboxValues (ComboboxId int,Name varchar(200))
-- набор значений в случае выбора нескольких значений.
MultiParamValue(ParamValueId int, ComboboxId int);


Вот примерно такая структура данных. Есть еще неявная таблица ParamType, которая обозначает, какой тип значения используется в ParamValue и откуда брать значение (из какого поля/таблицы), так же как и куда вставлять значение.
27 авг 12, 18:45    [13071988]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
_Промешан_
Member

Откуда:
Сообщений: 969
Все поля Tools а так же поля ParamValue и далее по списку - в зависимости от типа параметра или от его id могут быть изменены в данном цикле.
27 авг 12, 18:46    [13071994]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
invm
Member

Откуда: Москва
Сообщений: 9425
_Промешан_,

Не знаю как коллеги, а я до сих пор так и не могу понять что вам на самом деле нужно получить. И из чего.
Если вы не поленитесь подготовить тестовые наборы данных и желаемый результат, то, думается, дело сдвинется с мертвой точки.
27 авг 12, 19:15    [13072119]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживание хода выполнения процедуры (в случае с курсором).  [new]
телепауэ
Guest
ну понятно. клиентские задачи смешали с бдшными, от всей этой каши ждут какой-то прозрачности. и чтоб на форуме без подробностей все догадались с первого раза о чем речь.

насколько хватает фантазии:
- "неповторимые" свойства товаров для каких-то целей хранятся в реляционном виде
- "клиент" туповат, мертвоват, в качестве осинового кольчика выбрана генерация списков (содержимого) кобиков и чеклистов (для все тех же неповторимых свойств) на стороне сиквела и хранение этих сгенеренных списков в реляционном виде
- похоже что там не только EAV, там еще и перегенерация DML происходит. т.е. свойство с комбиком выворачивается в столбец, FK и справочник; свойство с чекбоксом - в столбец, FK, линковочную таблицу, еще FK и справочник.

я так понимаю, задача периодическая, т.е. не онлайновая.

если все примерно так, то (не вдаваясь про смысл и качество концепции) больше подошел бы job или даже консольное приложение.
цикл имеет смысл переделать с цикла "по всему что есть вдоль поперек" на цикл по группам/видам товаров.
в плане job можно группы товаров отдельными step'ами сделать.
27 авг 12, 19:55    [13072255]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2 3      [все]
Все форумы / Microsoft SQL Server Ответить