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

Откуда: Екатеринбург
Сообщений: 78
Добрый день!

Можно ли в MS SQL 2008 из одной ХП запустить другую ХП в отдельном потоке? Т.е. нужно выполнить несколько запросов и затем оставшиеся в фоновом режиме.

Заранее спасибо.
13 сен 11, 16:00    [11270379]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли в MS SQL 2008 запустить хранимую процедуру в отдельном потоке?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Можно.
13 сен 11, 16:02    [11270400]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли в MS SQL 2008 запустить хранимую процедуру в отдельном потоке?  [new]
сервисброкер подойдёт?
Guest
?
13 сен 11, 16:19    [11270537]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли в MS SQL 2008 запустить хранимую процедуру в отдельном потоке?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
сервисброкер подойдёт?, вы умете читать мысли?
Может TC вааще для этого ничего не нужно, т.к. возможно эту функцию лучше стороннее приложение на себя позмёт.
Перевожу, основная задача не ясна.

А так да, знать что за зверь этот SB обязательно.
13 сен 11, 16:38    [11270741]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли в MS SQL 2008 запустить хранимую процедуру в отдельном потоке?  [new]
Fire83
Member

Откуда: Гомель-Минск
Сообщений: 474
Limonad,

Если хотите вызвать асинхронно то можно созданием в процедуре джоба, который вызывает вторую хранимку.
13 сен 11, 17:25    [11271151]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли в MS SQL 2008 запустить хранимую процедуру в отдельном потоке?  [new]
KRS544
Member

Откуда:
Сообщений: 497
из 1 - ой процедуры вызываете

exec имя_процедуры2 параметры
13 сен 11, 18:14    [11271491]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли в MS SQL 2008 запустить хранимую процедуру в отдельном потоке?  [new]
Limonad
Member

Откуда: Екатеринбург
Сообщений: 78
нужно типа
Create PROCEDURE [dbo].[tetsProc]
@idRec int
AS
BEGIN
delete contentTable where id=@idRec
-- следующую процедуру выполнить асинхронно
exec testProc2 @idRec
END
13 сен 11, 20:07    [11272006]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли в MS SQL 2008 запустить хранимую процедуру в отдельном потоке?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Limonad
нужно типа
Create PROCEDURE [dbo].[tetsProc]
@idRec int
AS
BEGIN
delete contentTable where id=@idRec
-- следующую процедуру выполнить асинхронно
exec testProc2 @idRec
END

Мечтайте, ага. Или джобами, или сервисброкером, или еще чем, уже сказали все.
13 сен 11, 20:09    [11272012]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли в MS SQL 2008 запустить хранимую процедуру в отдельном потоке?  [new]
Skiff
Member

Откуда: Москва
Сообщений: 55
Может быть воспользоваться CLR?
Если это возможно.
13 сен 11, 22:45    [11272575]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли в MS SQL 2008 запустить хранимую процедуру в отдельном потоке?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
CREATE PROCEDURE [dbo].[tetsProc]
	@idRec	int
AS BEGIN
	delete contentTable where id=@idRec
	-- следующую процедуру выполнить асинхронно
	-- exec testProc2 @idRec
	...
	SEND ON CONVERSATION @Dialog
	MESSAGE TYPE 'testProc2' (@idRec);
	-- Или
	-- @Query = '<proc name="testProc2"><param value="{@idRec}"></proc>'
	SEND ON CONVERSATION @Dialog (@Query);
	-- Или
	set @Query = 'exec testProc2 ' + Convert(VarChar,@idRec)
	exec dbo.sp_CreateJob @Name=NULL, @Body=@Query, @DropAfter = 1
	-- Или
	exec dbo.sp_Async @Query
	-- Или исчё 100500 способами
	...
END
Интерфейс вызова на ваш вкус.

Повторюсь, может быть для вашей задачи оно не нужно. Ибо вам надо пересмотреть её решение, т.к. вы не знали о существовании SB и др. инструментов.
14 сен 11, 01:47    [11272900]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли в MS SQL 2008 запустить хранимую процедуру в отдельном потоке?  [new]
Limonad
Member

Откуда: Екатеринбург
Сообщений: 78
Спасибо за подсказки. Почитаю про джобы и сервис-брокер.

Есть вариант запустить ХП из .NET-приложения в отдельном потоке, но тогда будет висеть открытое соединение SQLConnection. Не хотелось бы этого допускать.
14 сен 11, 08:55    [11273199]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли в MS SQL 2008 запустить хранимую процедуру в отдельном потоке?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Limonad
висеть открытое соединение
Вы не поверите, но фоновые процессы будут работать в отдельной сессии палюбэ.
И Job-ы типа через чёрный ход пролазят на сервер?!

Контекст исполнения это интересный вопрос. Типа если надо сохранять контекст пользователя (права и всё такое)

А разве в CLR нельзя также очередью через один коннект все запросы, или соранить контекст и всё через него (аля MARS)?
Хотя всё равно изобретать ласапед на CLR глупо.
14 сен 11, 09:37    [11273356]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли в MS SQL 2008 запустить хранимую процедуру в отдельном потоке?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31983
Limonad
Спасибо за подсказки. Почитаю про джобы и сервис-брокер.

Есть вариант запустить ХП из .NET-приложения в отдельном потоке, но тогда будет висеть открытое соединение SQLConnection. Не хотелось бы этого допускать.
Как это???
Желание запустить в отдельном потоке и означает открыть соединение, которое будет висеть и в котором будет выполняться эта запущенная процедура. Какими бы средствами это не делалось.

Или вы просто не хотите усложнять клиентское приложение? Это да, правильное желание, наличие простого способа паралельного запуска было бы лучьше, но увы - такого способа нет :-(
14 сен 11, 09:39    [11273365]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли в MS SQL 2008 запустить хранимую процедуру в отдельном потоке?  [new]
Limonad
Member

Откуда: Екатеринбург
Сообщений: 78
alexeyvg
Как это???
Желание запустить в отдельном потоке и означает открыть соединение, которое будет висеть и в котором будет выполняться эта запущенная процедура. Какими бы средствами это не делалось.

Или вы просто не хотите усложнять клиентское приложение? Это да, правильное желание, наличие простого способа паралельного запуска было бы лучьше, но увы - такого способа нет :-(


ИЗ .NET приложения запускается процедуру, в которой:
1. выполняется какой-то запрос
2. происходит запуск в отдельном потоке другой процедуры

после п.2. разве не происходит возвращение результатов .NET приложению, в котором затем соединение закрывается (conn.Close()), а запущенная процедура на MS SQL выполняется дальше?
14 сен 11, 09:59    [11273450]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли в MS SQL 2008 запустить хранимую процедуру в отдельном потоке?  [new]
iljy
Member

Откуда:
Сообщений: 8711
Limonad
после п.2. разве не происходит возвращение результатов .NET приложению, в котором затем соединение закрывается (conn.Close()), а запущенная процедура на MS SQL выполняется дальше?

Нет. При закрытии соединения все текущие запросы останавливаются и происходит откат транзакции.
14 сен 11, 10:02    [11273462]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли в MS SQL 2008 запустить хранимую процедуру в отдельном потоке?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31983
Limonad
ИЗ .NET приложения запускается процедуру, в которой:
1. выполняется какой-то запрос
2. происходит запуск в отдельном потоке другой процедуры
Вы имеете в виду - запускается процедура в сиквеле и в этой процедуре запускается в отдельном потоке другая процедура?
Такое невозможно.

Можно сделать запуск отдельного потока в .NET, в котором создаётся коннект, в нём запускается процедура и этот поток ждёт завершения этой процедуры. Только так.

Или упомянутые выше способы с брокером, джобами - они будут открывать коннекты сами.
14 сен 11, 10:10    [11273495]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли в MS SQL 2008 запустить хранимую процедуру в отдельном потоке?  [new]
AHTOH_L
Member

Откуда: Нижний Новгород
Сообщений: 451
Можно асинхронные запросы из .Net приложения сделать.
14 сен 11, 10:30    [11273600]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли в MS SQL 2008 запустить хранимую процедуру в отдельном потоке?  [new]
zorrocool
Member

Откуда:
Сообщений: 10
Limonad,

Можно воспользоваться встроенным мехнизмом OLE-автоматизации:
	declare @sql nvarchar ( max ), @res int, @obj int
	set @sql = 'sqlcmd -S ServerName -E -q"exec YourBase.YourSchema.YourProc"'
	
	exec @res = sp_OACreate 'Wscript.Shell', @obj out
	
	exec @res = sp_OAMethod @obj, 'Run', null, @sql, 0, 0
	
	exec @res = sp_OADestroy @obj
14 сен 11, 10:48    [11273702]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли в MS SQL 2008 запустить хранимую процедуру в отдельном потоке?  [new]
Limonad
Member

Откуда: Екатеринбург
Сообщений: 78
Почитал про Service Broker, по идее, следующий код:
	...
        SEND ON CONVERSATION @Dialog
	MESSAGE TYPE 'testProc2' (@idRec);
       ...
дает лишь указание SB запустить процедуру, т.е. соединение уже устанавливает SB, а не .NET-приложение =>
1. Делаю вызов ХП из .NET-приложения
2. В ХП выполняю какие-то запросы, в конце вызываю
	...
        SEND ON CONVERSATION @Dialog
	MESSAGE TYPE 'testProc2' (@idRec);
       ...
3. В .NET-приложении вызываю conn.Close() и процедура запущенная из SB продолжает работать

Правильно?
16 сен 11, 08:57    [11284943]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли в MS SQL 2008 запустить хранимую процедуру в отдельном потоке?  [new]
mike909
Member

Откуда:
Сообщений: 662
Limonad
Почитал про Service Broker, по идее, следующий код:
	...
        SEND ON CONVERSATION @Dialog
	MESSAGE TYPE 'testProc2' (@idRec);
       ...
дает лишь указание SB запустить процедуру, т.е. соединение уже устанавливает SB, а не .NET-приложение =>
1. Делаю вызов ХП из .NET-приложения
2. В ХП выполняю какие-то запросы, в конце вызываю
	...
        SEND ON CONVERSATION @Dialog
	MESSAGE TYPE 'testProc2' (@idRec);
       ...
3. В .NET-приложении вызываю conn.Close() и процедура запущенная из SB продолжает работать

Правильно?

В общем правильно, но Вы забыли прочесть результат и закрыть диалог.
А в .NET как вы вытаскиваете результат, по @idRec ?
А как вы собираетесь в нескольких приложениях читать результат только по своим запросам ? (намек на неиспользуемый @Dialog).
Вот Вам для информации
16 сен 11, 09:44    [11285147]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить