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

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


Какие варианты можно рассмотреть?
13 янв 15, 08:55    [17108883]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше всего написать хранимую процедуру, которая будет выполнятся в потоке?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31959
igor888
Добрый день.

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


Какие варианты можно рассмотреть?
SQL Server слушает сетевой порт. Когда ему приходит команда, он её выполняет, и возвращает ответ. То есть он выступает в роли некоего "сервера".

Все потоки у SQL Server внутренние, программированию со стороны пользователя недоступны. Языка программирования, доступные программисту сервера, соответственно не поддерживают никаких "потоков", они расчитаны на обработку запросов от клиента и возврат какого то ответа клиенту.

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

А для решения вашей, описанной выше, задачи, нужно написать приложение на каком нибуть языке программирования.
13 янв 15, 09:16    [17108951]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше всего написать хранимую процедуру, которая будет выполнятся в потоке?  [new]
igor888
Guest
alexeyvg
igor888
Добрый день.

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


Какие варианты можно рассмотреть?
SQL Server слушает сетевой порт. Когда ему приходит команда, он её выполняет, и возвращает ответ. То есть он выступает в роли некоего "сервера".

Все потоки у SQL Server внутренние, программированию со стороны пользователя недоступны. Языка программирования, доступные программисту сервера, соответственно не поддерживают никаких "потоков", они расчитаны на обработку запросов от клиента и возврат какого то ответа клиенту.

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

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



Спасибо за ответ. Нужно сделать на сервере!

Задам вопрос по другому, можно ли выполнить процедуру в асинхронном режиме, запустив её через другую процедуру? Есть вариант с сервис брокером, но вот как остановить выполнение той процедуры? пока не могу понять... можно как вариант завести общедоступную переменную (BIT), которая при старте выполнения асинхронной процедуры имеет значение True... и при необходимости (например другой хранимой процедурой) присваивать значение переменной в False, что поспособствует выходу из процедуры запущенной сервис брокером...

но т.к. таких вещей ещё не делал, хочу послушать советы форумчан)))
13 янв 15, 09:30    [17109008]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше всего написать хранимую процедуру, которая будет выполнятся в потоке?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31959
igor888
Задам вопрос по другому, можно ли выполнить процедуру в асинхронном режиме, запустив её через другую процедуру? Есть вариант с сервис брокером, но вот как остановить выполнение той процедуры? пока не могу понять... можно как вариант завести общедоступную переменную (BIT), которая при старте выполнения асинхронной процедуры имеет значение True... и при необходимости (например другой хранимой процедурой) присваивать значение переменной в False, что поспособствует выходу из процедуры запущенной сервис брокером...
Ну, это будет выполнение не от другой процедуры, а от клиентского приложения - сервис-брокера.

"Общедоступных переменных" у сиквела нет. Есть таблицы.
13 янв 15, 09:34    [17109024]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше всего написать хранимую процедуру, которая будет выполнятся в потоке?  [new]
igor888
Guest
alexeyvg,

"Общедоступных переменных" у сиквела нет. Есть таблицы.


хм, печально...

Всё таки, может есть мыски как лучше всего сделать?
13 янв 15, 09:39    [17109039]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше всего написать хранимую процедуру, которая будет выполнятся в потоке?  [new]
Glory
Member

Откуда:
Сообщений: 104751
igor888
Всё таки, может есть мыски как лучше всего сделать?

Не использовать сервер баз данных как сервер приложений будет лучше всего.
13 янв 15, 09:40    [17109046]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше всего написать хранимую процедуру, которая будет выполнятся в потоке?  [new]
iiyama
Member

Откуда:
Сообщений: 642
Может автору нужно другое, хрустальный шар подсказывает
sp_start_job
sp_stop_job
13 янв 15, 10:42    [17109453]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше всего написать хранимую процедуру, которая будет выполнятся в потоке?  [new]
igor888
Guest
iiyama,

Спасибо за свет.
Не подходит((( Express(((

Думаю остаётся только сервис брокер? могу ошибаться...
13 янв 15, 10:55    [17109532]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше всего написать хранимую процедуру, которая будет выполнятся в потоке?  [new]
Valer
Member

Откуда:
Сообщений: 282
в начале скрипта можно создавать глобальную временную таблицу ##flag
при окончании ее удалять
скрипт при запуске проверяет ее наличие
если таблица есть , то отдыхаем
если таблицы нет, то создаем ее, выполняем содержательную часть , удаляем
13 янв 15, 11:22    [17109698]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше всего написать хранимую процедуру, которая будет выполнятся в потоке?  [new]
churupaha
Member

Откуда: Краснодар
Сообщений: 1015
igor888
Не подходит((( Express(((


windows scheduler?
13 янв 15, 11:28    [17109746]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше всего написать хранимую процедуру, которая будет выполнятся в потоке?  [new]
igor888
Guest
Valer
в начале скрипта можно создавать глобальную временную таблицу ##flag
при окончании ее удалять
скрипт при запуске проверяет ее наличие
если таблица есть , то отдыхаем
если таблицы нет, то создаем ее, выполняем содержательную часть , удаляем


Спасибо. Как вариант проверки состояния можно рассмотреть.
Но сейчас больше всего интересует как запустить выполнение процедуры, которая будет крутиться на сервере? как проверить работает ли она или нет?
13 янв 15, 11:29    [17109753]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше всего написать хранимую процедуру, которая будет выполнятся в потоке?  [new]
igor888
Guest
churupaha,

ой как не хотеться туда лезть! я думаю тут могут появиться нюанс с различными операционными системами (хз, свиста и т.п.)
13 янв 15, 11:32    [17109770]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше всего написать хранимую процедуру, которая будет выполнятся в потоке?  [new]
Valer
Member

Откуда:
Сообщений: 282
можно создать просто таблицу с 1 записью
при запуске хп пишет в нее свой спид, если поле пусто
отдыхаем , если не пусто
при завершении хп поле чистим
13 янв 15, 11:34    [17109789]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше всего написать хранимую процедуру, которая будет выполнятся в потоке?  [new]
ART-CODE
Member

Откуда:
Сообщений: 1095
Ну так напишите Database Engine Extended Stored Procedure
Еще в поиске много интересного по словам: MS SQL CLR Example

Я в свое время написал такое, и до сих пор использую на "боевых" серверах - очень выручает.
Но это для win32, зато с исходниками.
Правда, там не нужно было управлять потоками, но если бы понадобилось - то легко добавить.
13 янв 15, 11:35    [17109798]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше всего написать хранимую процедуру, которая будет выполнятся в потоке?  [new]
ART-CODE
Member

Откуда:
Сообщений: 1095
И, кстати, процедура не должна долго работать. Это не нормально.
Смотрите план запроса,проверяйте индексы, оптимизируйте, ускоряйте.
Лучше 10 раз вызвать процедуру, которая отработает быстро, чем один раз - долго.
И да, шедулер винды плюс vbs, вызывающий хранимку.
13 янв 15, 11:41    [17109833]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше всего написать хранимую процедуру, которая будет выполнятся в потоке?  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8811
автор
Какие варианты можно рассмотреть?

sp_getapplock
13 янв 15, 11:51    [17109894]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше всего написать хранимую процедуру, которая будет выполнятся в потоке?  [new]
igor888
Guest
Владислав Колосов
автор
Какие варианты можно рассмотреть?

sp_getapplock


Добрый день. Не могу понять чем это может пригодится?
13 янв 15, 12:02    [17109952]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше всего написать хранимую процедуру, которая будет выполнятся в потоке?  [new]
aleks2
Guest
igor888
Необходимо предусмотреть запуск потока

джоб

igor888
Поток должен быть только один. т.е. если он запущен, второй... третий и т.п. уже не запускаются. Если поток запущен, должна быть возможность его остановить.


sp_getapplock
13 янв 15, 12:13    [17109991]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше всего написать хранимую процедуру, которая будет выполнятся в потоке?  [new]
igor888
Guest
aleks2,

джоб не подойдёт т.к. Express

а по поводу sp_getapplock не понял... это блокировка приложения... или можно блокировать выполнение процедуры?
13 янв 15, 12:15    [17110004]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше всего написать хранимую процедуру, которая будет выполнятся в потоке?  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
igor888
А почитать вдумчиво ? Тінц
13 янв 15, 12:17    [17110018]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше всего написать хранимую процедуру, которая будет выполнятся в потоке?  [new]
Glory
Member

Откуда:
Сообщений: 104751
У igor888 какая то паталогическая тяга сделать из сервера баз данных что-нибудь другое.
То ETL, то планировщик задач, то серер приложений
Имхо.
13 янв 15, 12:23    [17110047]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше всего написать хранимую процедуру, которая будет выполнятся в потоке?  [new]
igor888
Guest
Maxx
igor888
А почитать вдумчиво ? Тінц


Прочитал уже несколько раз... не могу понять чем это может быть полезно? Подскажите плж
13 янв 15, 12:23    [17110052]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше всего написать хранимую процедуру, которая будет выполнятся в потоке?  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
igor888 Примеры здесь
13 янв 15, 13:15    [17110444]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше всего написать хранимую процедуру, которая будет выполнятся в потоке?  [new]
igor888
Guest
Maxx
igor888 Примеры здесь



Спасибо. Теперь стало понятно... допустим мы знаем работает ли процедура или нет + есть механизм гарантированного запуска одного экземпляра хранимой процедуры в один момент времени.

Теперь остаётся разобраться как запустить асинхронно хранимую процедуру на MSSQL2008R2 Express (тут джобы неработают)
13 янв 15, 13:34    [17110639]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше всего написать хранимую процедуру, которая будет выполнятся в потоке?  [new]
Glory
Member

Откуда:
Сообщений: 104751
igor888
Теперь остаётся разобраться как запустить асинхронно хранимую процедуру на MSSQL2008R2 Express (тут джобы неработают)

Гораздо интереснее будет узнать, как вы потом остановите такую процедуру
13 янв 15, 13:36    [17110652]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить