Sql server T-SQL:存储过程的执行
我有一个程序,它应该将数据保存到一个临时表中,并在最后删除旧记录,并将新记录插入到实际表中 程序结束如下:Sql server T-SQL:存储过程的执行,sql-server,tsql,Sql Server,Tsql,我有一个程序,它应该将数据保存到一个临时表中,并在最后删除旧记录,并将新记录插入到实际表中 程序结束如下: ... --THIS SELECT HAS THE CORRECT DATA SELECT * FROM @NewTempTable; BEGIN TRY BEGIN TRANSACTION; --DELETE OLD COMPONENTS DELETE FROM AlteracaoEngenharia.hComponents WHERE Id IN
...
--THIS SELECT HAS THE CORRECT DATA
SELECT * FROM @NewTempTable;
BEGIN TRY
BEGIN TRANSACTION;
--DELETE OLD COMPONENTS
DELETE FROM AlteracaoEngenharia.hComponents
WHERE Id IN (SELECT C.Id
FROM AlteracaoEngenharia.hComponents AS C
JOIN AlteracaoEngenharia.hEngineeringChanges AS EC ON C.EngineeringChangeId = EC.Id
WHERE C.Name NOT LIKE '%(Manual)%' AND EC.State LIKE 'Aberto');
INSERT INTO AlteracaoEngenharia.hComponents (Name, OldQuantity, Quantity, CDP, Value, Type, EngineeringChangeId)
(SELECT
Name, OldQuantity, Quantity, CDP, Value, Type, EngineeringChangeId
FROM
@NewTempTable);
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
END CATCH
END
如果我选择所有过程,直到开始尝试并执行它,它不会给出任何错误,并且我在@NewTempTable上获得了预期的数据;但是,当保存过程并尝试执行它时,我得到了以下错误
虽然@NewTempTable具有预期的数据,但过程的执行返回-6,并且数据不会插入到alteracoengenharia.hComponents中
我收到的所有数据都不为null,alteracoengenharia.hComponents列也不可为null
我在TestServer中也有相同的过程,但有些连接是不同的,但如果这是错误的话,我将不会得到任何数据,并且该过程工作正常
我知道我没有展示大部分的过程,但是它有点复杂,并且有合理的信息。我希望通过我所描述的,我能在正确的方向上得到一些指点
注:我已经尝试了@newtpuntable和newtpuntable尝试下面的代码块:
BEGIN TRANSACTION;
BEGIN TRY
--DELETE OLD COMPONENTS
Delete From AlteracaoEngenharia.hComponents where Id in
(Select C.Id From AlteracaoEngenharia.hComponents as C
Join AlteracaoEngenharia.hEngineeringChanges as EC on C.EngineeringChangeId = EC.Id
Where C.Name not like '%(Manual)%' and EC.State like 'Aberto');
Insert Into AlteracaoEngenharia.hComponents (Name, OldQuantity, Quantity, CDP, Value, Type, EngineeringChangeId)
(Select Name, OldQuantity, Quantity, CDP, Value, Type, EngineeringChangeId From @NewTempTable);
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
BEGIN
ROLLBACK TRANSACTION;
throw;
END
END CATCH;
IF @@TRANCOUNT > 0
BEGIN
COMMIT TRANSACTION;
PRINT 'Successfully Completed'
END
确保错误后完全回滚的最佳方法是使用XACT_ABORT,这将强制所有错误中止批处理,并回滚事务: 将XACT_ABORT设置为ON; 不计数; 开始交易; -删除旧组件 从alteracoengenharia.hComponents中删除 其中Id在SELECT C.Id中 来自Alteracoengenharia.h组件,作为C 在C.EngineeringChangeId=EC.Id上加入AlteraCoengenharia.HengineRegingChanges作为EC 其中C.名称不象“%Manual%”,EC.状态象“Aberto”; 将组件名称、旧数量、数量、CDP、值、类型、工程变更ID插入AlteraCoengenharia.h 选择 名称、旧数量、数量、CDP、值、类型、工程变更ID 从…起 @可拆卸的; 提交事务;
此处不需要TRY/CATCH或ROLLBACK,任何错误都会自动回滚。如果您有错误,则您有一个打开的事务,当您的CATCH为空时,不会发生任何事情。您还完全忽略任何错误,不抛出错误,因此不知道代码是否失败。您使用的是sql server吗?