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

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

Есть процедура , которая на вход получает incominbg_id - id сообщения и result_id (int) - id результата
Если result_id = 2 , то сообщение удаляем из табл. очередь , если не 2 , то оставляем сообщение в очереди.

Собственно я с задачей справился , но получилось много кода.
Вопрос : Как можно уменьшить , если какие струткутры (кроме if например) , t-sql начал изучать относительно недавно.



CREATE PROCEDURE [dbo].[vru_Rtest]
@incoming_id INT,
@result_id INT
--WITH ENCRYPTION
AS

SET NOCOUNT ON

SET IMPLICIT_TRANSACTIONS OFF

DECLARE @sp_name VARCHAR(128), -- Имя ХП

@return_code INT, -- Код возврата ЭТОЙ хранимой

@sp_result int, -- Результат вызова вложенных ХП

@errornum INT, -- Код ошибки

@errormsg VARCHAR(8000), -- Сообщение об ошибке

/*

Поведение системы в случае ошибок

0 - Пытаться обработать ошибку, сообщение не выдавать

1 - Пытаться обработать ошибку, выдать сообщение

2 - Выдать сообщение об ошибке, остановить выполнение.

*/

@paranoia_level TINYINT



SELECT @paranoia_level = 2,

@return_code = 1



SELECT @sp_name = OBJECT_NAME(@@PROCID)

--Локальные константы для проекта smsTOfix
/********** message_status_c***************/
DECLARE
@NEW_MESSAGE INT,
@MESSAGE_SENDING INT,
@MESSAGE_IN_QUEUE INT,
@MESSAGE_DOSTAVLENO INT,
@MESSAGE_NE_DOSTAVLENO INT,
@MESSAGE_DELETE INT,
@MESSAGE_ATTENTION_SENDING INT,
@MESSAGE_ATTENTION_NOT_SEND INT,
@MESSAGE_ATTENTION_DOSTAVLENO INT,
@MESSAGE_ATTENTION_NE_DOSTAVLENO INT,
@ERROR_MESSAGE INT

SET @NEW_MESSAGE = 1
SET @MESSAGE_SENDING = 2
SET @MESSAGE_IN_QUEUE = 3
SET @MESSAGE_DOSTAVLENO = 4
SET @MESSAGE_NE_DOSTAVLENO = 5
SET @MESSAGE_DELETE = 6
SET @MESSAGE_ATTENTION_SENDING = 7
SET @MESSAGE_ATTENTION_NOT_SEND = 8
SET @MESSAGE_ATTENTION_DOSTAVLENO = 9
SET @MESSAGE_ATTENTION_NE_DOSTAVLENO = 10
SET @ERROR_MESSAGE = 11
/********** message_status_c***************/


/********** message_event_type_c ***************/
DECLARE
@CREATING_MESSAGE INT,
@GET_MESSAGE_FROM_QUEUE INT,
@MESSAGE_DOSTAVLENO_EVENT INT,
@MESSAGE_NE_DOSTAVLENO_EVENT INT,
@MESSAGE_IN_QUEUE_EVENT INT,
@MESSAGE_DELETED INT,
@MESSAGE_DOSTIG_MAX_ATTEMPT_SEND INT,
@MESSAGE_STATUS_CHANGE INT

SET @CREATING_MESSAGE = 1
SET @GET_MESSAGE_FROM_QUEUE = 2
SET @MESSAGE_DOSTAVLENO_EVENT = 3
SET @MESSAGE_NE_DOSTAVLENO_EVENT = 4
SET @MESSAGE_IN_QUEUE_EVENT = 7
SET @MESSAGE_DELETED = 6
SET @MESSAGE_DOSTIG_MAX_ATTEMPT_SEND = 5
SET @MESSAGE_STATUS_CHANGE = 8


/********** message_event_type_c ***************/
--Рабочие переменные.
DECLARE
@from_number VARCHAR(125),
@to_number VARCHAR(125),
@new_result INT,
@max_ring INT,
@num_attempt INT,
@date_come DATETIME

select @date_come = GETDATE()
select @max_ring = max_attempt_ring from configuration
select @num_attempt = num_attempt
from queue_message_incoming where incoming_id = @incoming_id

IF @result_id <> 2
begin
IF @num_attempt >= @max_ring
begin
/**********************************
* WARNING!!! BEGIN TRANSACTION
***********************************/
BEGIN TRANSACTION

DELETE FROM queue_message_incoming
WHERE incoming_id = @incoming_id
IF @@ERROR <> 0
begin
SELECT @errornum = 20100,
@return_code = -6,
@errormsg = 'Ошибка в ХП: ' + @sp_name + '. Ошибка при удалении сообщения из очереди.'
GOTO ERROR_EXIT
end
--Обновлении статуса.
UPDATE incoming
SET message_status_id = @MESSAGE_NE_DOSTAVLENO --Истекло кол-во попыток отправки сообщения.
WHERE incoming_id = @incoming_id
IF @@ERROR <> 0
begin
SELECT @errornum = 20100,
@return_code = -1,
@errormsg = 'Ошибка в ХП: ' + @sp_name + '. Ошибка при обновлении статуса.'
GOTO ERROR_EXIT
end

EXECUTE @sp_result = vru_SendProtocol @message_event_type_id = @MESSAGE_NE_DOSTAVLENO,
@message_status_id = @MESSAGE_NE_DOSTAVLENO,
@message_id = @incoming_id,
@message_type = 1,
@from_number = @from_number,
@to_number = @to_number,
@result_delivery_id = @result_id,
@date_come = @date_come
IF @@ERROR <> 0 OR @sp_result <= 0
begin
SELECT @errornum = 20100,
@return_code = -56,
@errormsg = 'Ошибка в ХП: ' + @sp_name + '. Ошибка при вызове ХП '
GOTO ERROR_EXIT
end

/**********************************
* WARNING!!! COMMIT TRANSACTION
***********************************/
COMMIT TRANSACTION
end --
else
begin
--Процедура изменяет статус сообщения в таблице очередь.
EXECUTE @sp_result = vru_NumAttemptIn @message_id = @incoming_id,
@message_status_id = @MESSAGE_IN_QUEUE
IF @@ERROR <> 0 OR @sp_result <= 0
begin
SELECT @errornum = 20100,
@return_code = -1,
@errormsg = 'Ошибка в ХП: ' + @sp_name + ' при обновлении статуса сообщения'
+'@message_id = ' + convert(varchar(20),@incoming_id)
GOTO ERROR_EXIT
end

EXECUTE @sp_result = vru_SendProtocol @message_event_type_id= @MESSAGE_STATUS_CHANGE,
@message_status_id = @MESSAGE_SENDING,
@message_id = @incoming_id,
@message_type = 1,
@from_number = @from_number,
@to_number = @to_number,
@result_delivery_id = @result_id,
@date_come = @date_come

IF @@ERROR <> 0 OR @sp_result <= 0
begin
SELECT @errornum = 20100,
@return_code = -14,
@errormsg = 'Ошибка в ХП: ' + @sp_name + '. Ошибка при вызове ХП ""'
GOTO ERROR_EXIT
end
end
end --
else
begin
/**********************************
* WARNING!!! BEGIN TRANSACTION
***********************************/
BEGIN TRANSACTION

EXECUTE @sp_result = vru_Status_message_event @incoming_id = @incoming_id,
@message_status_id = @MESSAGE_ATTENTION_NOT_SEND
IF @@ERROR <> 0 OR @sp_result <= 0
begin
SELECT @errornum = 20100,
@return_code = -2,
@errormsg = 'Ошибка в ХП: ' + @sp_name + ' при обновлении статуса сообщения.'
GOTO ERROR_EXIT
end

DELETE FROM queue_message_incoming
WHERE incoming_id = @incoming_id

EXECUTE @sp_result = vru_SendProtocol @message_event_type_id = @MESSAGE_DOSTAVLENO_EVENT,
@message_status_id = @MESSAGE_ATTENTION_NOT_SEND,
@message_id = @incoming_id,
@message_type = 1,
@from_number = @from_number,
@to_number = @to_number,
@result_delivery_id = 2,
@date_come = @date_come
IF @@ERROR <> 0 OR @sp_result <= 0
begin
SELECT @errornum = 20100,
@return_code = -3,
@errormsg = 'Ошибка в ХП: ' + @sp_name + ' при протоколировании сообщения.'
GOTO ERROR_EXIT
end

--Процедура обновлении даты в таблице incoming о доставке (дата).
EXECUTE @sp_result = vru_Deleviry_Date @incoming_id = @incoming_id,
@date_come = @date_come
IF @@ERROR <> 0 OR @sp_result <= 0
begin
SELECT @errornum = 20100,
@return_code = -4,
@errormsg = 'Ошибка в ХП: ' + @sp_name + ' при занесении даты доставки в таблицу incoming'
GOTO ERROR_EXIT
end

/**********************************
* WARNING!!! COMMIT TRANSACTION
***********************************/
COMMIT TRANSACTION
end

OK_EXIT:
RETURN @return_code
ERROR_EXIT:
RAISERROR @errornum @errormsg
IF @@TRANCOUNT <> 0 ROLLBACK TRANSACTION
RETURN @return_code
12 янв 10, 13:12    [8170627]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить