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吗?