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

Откуда:
Сообщений: 173
Добрый день.
Для моей задачи необходимо проверять запущена ли в данный момент процедура.

Пытаюсь сделать это так:

select 1
from sys.sysprocesses as qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) st
where object_name(st.objectid) = 'Моя_процедура'

Когда тестировал данный способ все работало прекрасно. Те запускал тестовую процедуру и скрипт выдавал значение = 1.
Но когда я запускаю боевую процедуру то вышеуказанный скрипт ее в упор не видит. В чем может быть проблема? Это же не может быть связано со сложностью самой процедуры?
10 июл 18, 14:40    [21559541]     Ответить | Цитировать Сообщить модератору
 Re: Проверка запущена ли процедура через sys.sysprocesses  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
assmsk,

что такое сложность процедуры? Если процедуры вызывает другую, то в процессах будет другая.
А так подозреваю городите очередной sp_getapplock
10 июл 18, 14:49    [21559590]     Ответить | Цитировать Сообщить модератору
 Re: Проверка запущена ли процедура через sys.sysprocesses  [new]
assmsk
Member

Откуда:
Сообщений: 173
Просто не могу концептуально понять почему когда делаешь это на условной тестовой процедуре:

create procedure test as declare @i int while 1 < 2 begin set @i = 1 end

То все прекрасно работает. А когда запускаешь уже свою процедуру с несложным но километровым кодом, то она не отображается в запущенных процессах но при этом работает.
10 июл 18, 15:05    [21559646]     Ответить | Цитировать Сообщить модератору
 Re: Проверка запущена ли процедура через sys.sysprocesses  [new]
felix_ff
Member

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

если у вас в "километровом коде" вызываются другие модули, то ваш исходный модуль будет скрыт их вызовами.

create proc long_proc2
as 
waitfor delay '00:00:30'
select object_name(@@PROCID) + ' ends';
go


create proc long_proc1
as 
exec long_proc2
waitfor delay '00:00:30'
select object_name(@@PROCID) + ' ends';
go

exec long_proc1


в другой сессии позапускайте и посмотрите как будет меняться выполняемый модуль
select object_name(st.objectid), st.text
from sys.sysprocesses as qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) st 
where object_name(st.objectid) is not null
10 июл 18, 15:19    [21559699]     Ответить | Цитировать Сообщить модератору
 Re: Проверка запущена ли процедура через sys.sysprocesses  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1346
и еще кстати лучше использовать представление sys.dm_exec_requests вместо sys.sysprocesses если конечно версия не 2000
10 июл 18, 15:24    [21559725]     Ответить | Цитировать Сообщить модератору
 Re: Проверка запущена ли процедура через sys.sysprocesses  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
assmsk
Просто не могу концептуально понять почему когда делаешь это на условной тестовой процедуре:

create procedure test as declare @i int while 1 < 2 begin set @i = 1 end

То все прекрасно работает. А когда запускаешь уже свою процедуру с несложным но километровым кодом, то она не отображается в запущенных процессах но при этом работает.

кончептуально: очевидно в несложном но километровым

автор
create procedure test as declare @i int while 1 < 2 begin EXEC('несложный но километровый') end
10 июл 18, 15:25    [21559728]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить