Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
编写此SQL存储过程的更好方法是什么?_Sql_Sql Server 2005_Stored Procedures - Fatal编程技术网

编写此SQL存储过程的更好方法是什么?

编写此SQL存储过程的更好方法是什么?,sql,sql-server-2005,stored-procedures,Sql,Sql Server 2005,Stored Procedures,我使用SQL存储过程更新交易日志,同时使用同一存储过程更新当前订单表 因为我遇到了一个严重的问题,日志表没有更新,而当前的订单表没有更新。。。我在底部添加了第三个例程,该例程检查日志表是否参考ID ClientID更新,然后在错误表中输入错误(如果不存在) 我在问。。。这场狂欢有多糟糕??谢谢你的帮助或建议 ALTER PROCEDURE dbo.sprocVT4_addTradeLong @seqno varchar(35) = NULL, @exctyp varchar(35) = NULL

我使用SQL存储过程更新交易日志,同时使用同一存储过程更新当前订单表

因为我遇到了一个严重的问题,日志表没有更新,而当前的订单表没有更新。。。我在底部添加了第三个例程,该例程检查日志表是否参考ID ClientID更新,然后在错误表中输入错误(如果不存在)

我在问。。。这场狂欢有多糟糕??谢谢你的帮助或建议

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

我不是100%确定您在问什么,但似乎您需要了解一些数据库事务。基本上,您可以将查询集包装到事务中,它将确保所有操作都已完成,或者没有任何操作已完成。因此,如果发生错误,整个操作将回滚


菲尔在交易方面提出了一个很好的观点。这个概念被称为原子性,基本上意味着每个事务/进程都是原子的、自包含的

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块,该块将回滚打开的事务


在更高的层次上,可能是因为这场大爆炸记录了已完成的事件,所以我无论如何都需要了解它。如果没有进一步的背景说明您正在尝试做什么,就很难给出如何改进的建议。从仅仅看你发布的内容开始,尽管它看起来已经足够直截了当了。谢谢@啊,这很有帮助。