我对以下模式的副作用和潜在问题感兴趣: CREATE PROCEDURE [Name] AS BEGIN BEGIN TRANSACTION BEGIN TRY […Perform work, call nested procedures…] END TRY BEGIN CATCH ROLLBACK TRANSACTION RAISERROR [rethrow caught error using @ErrorNumber, @ErrorMessage, etc] END CATCH END 据我所知,这种模式在使用单个过程时是合理的 – 过程将完成所有的语句而没有错误,或者它将回滚所有的操作并报告错误。 但是,当一个存储过程调用另一个存储过程来完成某个子单元的工作时(我们理解小过程有时自己会被调用),所以我看到一个与回滚有关的问题 – 一个信息性消息(级别16)发出说明The ROLLBACK TRANSACTION request has no corresponding BEGIN TRANSACTION. 。 我假设这是因为子过程中的回滚总是回滚最外层的事务,而不仅仅是在子过程中启动的事务。 我希望整个事情回滚和中止,如果有任何错误发生(和错误报告给客户端作为SQL错误),我只是不确定所有来自外层尝试回滚事务的副作用已经回滚了。 在每个TRY CATCH层执行回滚之前,可能需要检查@@TRANCOUNT ? 最后是客户端(Linq2SQL),它有自己的事务层: try { […]
我必须更新一个由3个表连接返回的值的字段。 例: select im.itemid ,im.sku as iSku ,gm.SKU as GSKU ,mm.ManufacturerId as ManuId ,mm.ManufacturerName ,im.mf_item_number ,mm.ManufacturerID from item_master im, group_master gm, Manufacturer_Master mm where im.mf_item_number like 'STA%' and im.sku=gm.sku and gm.ManufacturerID = mm.ManufacturerID and gm.manufacturerID=34 我想更新表item_master的mf_item_number字段值与在上述条件下加入的其他值。 我如何在MS SQL Server中执行此操作?