#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% в том, о чем вы спрашиваете, но, похоже, вам нужно немного почитать о транзакциях базы данных. По сути, вы можете обернуть набор запросов в транзакцию, и это гарантирует, что либо все операции будут завершены, либо ни одна из них. Поэтому, если возникает ошибка, вся операция будет отменена.
Комментарии:
1. возможно, на более высоком уровне, но этот sproc записывает завершенные события, поэтому мне нужно знать об этом, несмотря ни на что.