Какой лучший способ написать эту хранимую процедуру SQL?

#sql #sql-server-2005 #stored-procedures

#sql #sql-server-2005 #хранимые процедуры

Вопрос:

Я обновляю журнал транзакций Trades, используя хранимую процедуру SQL, и одновременно обновляю текущую таблицу заказов с помощью того же sproc.

Потому что у меня была серьезная проблема, когда таблица журнала не обновлялась, а таблица текущего заказа обновлялась… Я добавил (3-ю) процедуру внизу, которая проверяет, была ли обновлена таблица журнала, ссылаясь на идентификатор (ClientID), затем вводит ошибку, если она отсутствует, в таблицу ошибок.

Я спрашиваю… насколько плохо написан этот sproc?? Помощь или совет приветствуются.

 ALTER PROCEDURE dbo.sprocVT4_addTradeLong
@seqno varchar(35) = NULL,
@exctyp varchar(35) = NULL,
@ordstat varchar(35) = NULL,
@clid varchar(35) = NULL,
@exid varchar(35) = NULL,
@type varchar(35) = NULL,
@side varchar(35) = NULL,
@exch varchar(35) = NULL,
@sym varchar(35) = NULL,
@lstqty varchar(35) = NULL,
@lstpri varchar(35) = NULL,
@text varchar(35) = NULL,
@cumqty varchar(35) = NULL,
@lftqty varchar(35) = NULL,
@now varchar(35) = NULL
AS
BEGIN
-- NO EXISTS ------------
Declare @RC int

SELECT [Symbol] FROM TradesLongForex T WHERE T.ExecId = @exid

SELECT @RC = @@ROWCOUNT
IF @RC <= 0

INSERT INTO TradesLongForex ([SeqNo], [ExecType], [Status], [ClientId], [ExecId], [Type], [Side], [Exchange], [Symbol], [LastQty], [LastPrice], [Text], [CummQty], [LeftQty], [Date])

VALUES (@seqno, @exctyp, @ordstat, @clid, @exid, @type, @side, @exch, @sym, @lstqty, @lstpri, @text, @cumqty, @lftqty, @now)

UPDATE OrdersIdHoldForex SET [OrdExcType] = @exctyp, [OrdStatus] = @ordstat, [OrdType] = @type, [OrdSide] = @side, [OrdPrice] = @lstpri, [OrdQty] = @cumqty, [OrdRemain] = @lftqty

WHERE [Ticker] = @sym

DECLARE @RC2 int

SELECT @RC2 = @@ROWCOUNT

SELECT [ClientId] FROM TradesLongForex WHERE [ClientId] = @clid
if @RC2 <=0

INSERT INTO ERRLOG ([Date], [Message])

VALUES (GETDATE(), 'ERROR INSERTING TRADESLONGFOREX CLID = '   CONVERT(varchar(10),@CLID))

END
  

Комментарии:

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

Ответ №1:

Фил делает хорошее замечание о транзакциях. Эта концепция называется «Атомарность» и в основном означает, что каждая транзакция / процесс является атомарной и самодостаточной.

Общий синтаксис для транзакций в SQL server будет примерно таким:

 BEGIN TRY
BEGIN TRANSACTION
...

your code here

...

COMMIT TRANSACTION
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 1 ROLLBACK

... error reporting code ...

END CATCH
  

Суть этого заключается в том, чтобы использовать TRY/CATCH блоки для отслеживания ошибок и фиксировать транзакцию только в том случае, если вы пройдете весь TRY блок без проблем. Любые ошибки отправляют вас в CATCH блок, который откатывает открытую транзакцию.

Вот руководство по обработке ошибок.

Ответ №2:

Я не уверен на 100% в том, о чем вы спрашиваете, но, похоже, вам нужно немного почитать о транзакциях базы данных. По сути, вы можете обернуть набор запросов в транзакцию, и это гарантирует, что либо все операции будут завершены, либо ни одна из них. Поэтому, если возникает ошибка, вся операция будет отменена.

http://en.wikipedia.org/wiki/Database_transaction

Комментарии:

1. возможно, на более высоком уровне, но этот sproc записывает завершенные события, поэтому мне нужно знать об этом, несмотря ни на что.