我正在使用SQL存储过程更新交易交易日志,并且我使用相同的存储过程同时更新当前订单表。
因为我有一个严重的问题,Log表没有更新而当前订单表没有...我在底部添加了一个(第3个)例程,它检查日志表是否更新引用ID(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
答案 0 :(得分:2)
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
块,从而回滚打开的事务。
答案 1 :(得分:0)
我不是100%肯定你在问什么,但似乎你需要阅读一些关于数据库事务的内容。实质上,您可以在事务中包装查询集,并确保所有操作都已完成,或者都不是。因此,如果发生错误,将回滚整个操作。