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

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

Понимаю что курсок это зло и т.д. и вообще из sql вызывать wcf это тоже не есть best practice, но это не мое желание, а необходиомсть.

Можно ли как-то перепесать курсор на сте? Не понимаю как это можно приготовить, чтобы было изящней


/****** Object:  StoredProcedure [support].[usp_SendEmailMessages]    Script Date: 03-Apr-16 6:42:12 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [support].[usp_SendEmailMessages] @MMT MailMessagesType READONLY
AS
SET NOCOUNT ON

DECLARE @TotalMessages AS INT = (
		SELECT count(Id)
		FROM @MMT
		);
DECLARE @MAIL_INPROGRESS AS INT = 2;
DECLARE @MAIL_ERROR AS INT = 3;
DECLARE @MAIL_SENDED AS INT = 4;
DECLARE @logTable TABLE (LogTextError NVARCHAR(max))
DECLARE @LogTextError NVARCHAR(max)
DECLARE @serviceCall NVARCHAR(max)
DECLARE @i INT = 0
DECLARE @mailMessageId INT
DECLARE @HouseCallIds NVARCHAR(max)
DECLARE serviceCursor CURSOR
FOR
SELECT [Id]
FROM @MMT ins

--WHERE ins.MinutesMarker = 'ZeroMinutesMarker'
OPEN serviceCursor;

FETCH NEXT
FROM serviceCursor
INTO @mailMessageId;

WHILE @i < @TotalMessages
	-- @@FETCH_STATUS = 0
BEGIN
	SELECT @serviceCall = ''

	SELECT @serviceCall = @serviceCall + 'EXEC [dbo].[WCFSeviceStoredProcedureSendEmail] '
	+ CHAR(39) + [Body] + CHAR(39) + ', ' + CHAR(39) + [Subject] + CHAR(39) + ',' + CHAR(39) + [To] + CHAR(39) + ', ' 
	+ CHAR(39) + [From] + CHAR(39) + ',' + CHAR(39) + CONVERT(VARCHAR, ISNULL([IsHtmlBody], 0)) + CHAR(39) + '; '
	FROM @MMT
	WHERE Id = @mailMessageId

	BEGIN TRY
		PRINT (@mailMessageId)

		-- Updated email-message. Set status 'In progress' 
		EXECUTE [support].[uspUpdateMailMessages] @mailMessageId
			,@MAIL_INPROGRESS

		PRINT (@serviceCall)

		--Call wcf service. Send e-mail  
		EXEC (@serviceCall)

		--Updated email-message. Set status 'Send'  
		EXECUTE [support].[uspUpdateMailMessages] @mailMessageId
			,@MAIL_SENDED
	END TRY

	BEGIN CATCH

	END CATCH

	SET @i = @i + 1

	FETCH NEXT
	FROM serviceCursor
	INTO @mailMessageId;
END

CLOSE serviceCursor;

DEALLOCATE serviceCursor;
3 апр 16, 18:50    [19011382]     Ответить | Цитировать Сообщить модератору
 Re: Помогите переписать курсор  [new]
iljy
Member

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

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

PS А сте тут каким боком вообще?
3 апр 16, 19:01    [19011412]     Ответить | Цитировать Сообщить модератору
 Re: Помогите переписать курсор  [new]
iljy
Member

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

только вот это вот
EXEC (@serviceCall)


не понятно, зачем. Почему не сформировать параметр и вызывать процедуру по-людски, а не собирать динамический sql?
3 апр 16, 19:03    [19011421]     Ответить | Цитировать Сообщить модератору
 Re: Помогите переписать курсор  [new]
aleks2
Guest
iljy
Igor_kab,

только вот это вот
EXEC (@serviceCall)


не понятно, зачем. Почему не сформировать параметр и вызывать процедуру по-людски, а не собирать динамический sql?

А как же SQL-injection?
3 апр 16, 19:08    [19011442]     Ответить | Цитировать Сообщить модератору
 Re: Помогите переписать курсор  [new]
Igor_kab
Member

Откуда:
Сообщений: 16
iljy
Igor_kab,

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

PS А сте тут каким боком вообще?



сте - да хз, может я о чем-то не знаю и как-то можно переписать более правильно и чтобы перфоманс был бы круче. Все знают что курсоры - зло

iljy
Igor_kab,

только вот это вот
EXEC (@serviceCall)

не понятно, зачем. Почему не сформировать параметр и вызывать процедуру по-людски, а не собирать динамический sql?


А есть разница в перфомансе?
3 апр 16, 19:12    [19011452]     Ответить | Цитировать Сообщить модератору
 Re: Помогите переписать курсор  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31949
Igor_kab
А есть разница в перфомансе?
Почти нет.
Но есть разница в безопасности, контроле ошибок, отладке, читаемости кода, использования сред программирования и тулзов для помощи программирования.
Почему бы не выполнить простой код сам по себе, непосредственно, вместо составления каждый раз в переменной текста проги, компилирования её, и выполнения? Смысл какой этого?
3 апр 16, 19:18    [19011471]     Ответить | Цитировать Сообщить модератору
 Re: Помогите переписать курсор  [new]
iljy
Member

Откуда:
Сообщений: 8711
Igor_kab

А есть разница в перфомансе?


Нет, а вот SQL Injection в вашем случае реально можно поймать
3 апр 16, 19:20    [19011475]     Ответить | Цитировать Сообщить модератору
 Re: Помогите переписать курсор  [new]
iljy
Member

Откуда:
Сообщений: 8711
Igor_kab
сте - да хз, может я о чем-то не знаю и как-то можно переписать более правильно и чтобы перфоманс был бы круче. Все знают что курсоры - зло



СТЕ - это не серебряная пуля, а просто инструмент, позволяющий сделать более читаемые запросы, ну и при желании получить рекурсию. Вызвать процедуру он вам не даст. А курсоры не зло, а обычный инструмент со своей областью применения. Зло - это когда болты начинают кувалдой забивать.
3 апр 16, 19:23    [19011486]     Ответить | Цитировать Сообщить модератору
 Re: Помогите переписать курсор  [new]
Igor_kab
Member

Откуда:
Сообщений: 16
alexeyvg
Igor_kab
А есть разница в перфомансе?
Почти нет.
Но есть разница в безопасности, контроле ошибок, отладке, читаемости кода, использования сред программирования и тулзов для помощи программирования.
Почему бы не выполнить простой код сам по себе, непосредственно, вместо составления каждый раз в переменной текста проги, компилирования её, и выполнения? Смысл какой этого?


Спасибо за критику. SQL для меня не основной инструментарий, поэтому некоторое вещи могут быть написаны не оптимально. В любом случае учту комментарии и сделаю небольшой рефакторинг
3 апр 16, 19:26    [19011497]     Ответить | Цитировать Сообщить модератору
 Re: Помогите переписать курсор  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31949
Igor_kab
В любом случае учту комментарии и сделаю небольшой рефакторинг
Ещё обратите внимание на
BEGIN CATCH
END CATCH

Пустой обработчик ошибок - зло :-)
3 апр 16, 22:14    [19012185]     Ответить | Цитировать Сообщить модератору
 Re: Помогите переписать курсор  [new]
Igor_kab
Member

Откуда:
Сообщений: 16
alexeyvg
Igor_kab
В любом случае учту комментарии и сделаю небольшой рефакторинг
Ещё обратите внимание на
BEGIN CATCH
END CATCH

Пустой обработчик ошибок - зло :-)


Преднамеренно удалил тот код из примера, чтобы не усложнять
5 апр 16, 21:55    [19020929]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить