Как лучше написать эту хранимую процедуру SQL? - PullRequest
0 голосов
/ 13 апреля 2011

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

Поскольку у меня была серьезная проблема, когда таблица журнала не обновлялась, а таблица текущего заказа ... ... я добавил (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

Ответы [ 2 ]

2 голосов
/ 13 апреля 2011

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

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

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, который откатывает открытую транзакцию.

Вот учебник по обработке ошибок.

0 голосов
/ 13 апреля 2011

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

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

...