问一个带事宜的存储过程模板?

问一个带事务的存储过程模板???
ALTER procedure [dbo].[sp_TRANSACTION_Templater]
as

--带事务存储过程模板
begin
--开始事务
BEGIN TRANSACTION
SAVE TRANSACTION sp_Datacomputer_TRANS

问题一:这里的“SAVE TRANSACTION ”的作用是什么?      是设置一个回滚标记吗???

--事务内容


----------

--发生错误回滚事务
if (@@error <> 0)
begin
goto LABROLLBACK
end


  问题二:SQL语句成功执行完了,这里并没有用“goto LABCOMMIT”手动提交事务。        SQL语句执行完后,事务会自动提交对吧???


--提交事务
LABCOMMIT:
if (@@error = 0)
begin
COMMIT TRANSACTION
return(0)
end
--以下回滚事务
LABROLLBACK:
begin
ROLLBACK TRANSACTION sp_Datacomputer_TRANS
return @@error
end

问题三:在“BEGIN TRANSACTION”外面加一个判断,和在它里面加个判断应该都没有问题吧???
          


end





------解决方案--------------------
问题一:这里的“SAVE TRANSACTION ”的作用是什么?      是设置一个回滚标记吗???
设置一个事务的保存点,可以用于回滚特定部分

问题二:SQL语句成功执行完了,这里并没有用“goto LABCOMMIT”手动提交事务。        SQL语句执行完后,事务会自动提交对吧???
不会

用了begin tran,就要显式使用commit/rollback
问题三:在“BEGIN TRANSACTION”外面加一个判断,和在它里面加个判断应该都没有问题吧???  
当然有,在里面加算是事务里面的东西,在外面加就不算这个事务的东西,在回滚时有不同的结果

------解决方案--------------------
看了一下你这个模版,有点问题,应该直接判断是否有错并作出判断,而模版只有对--发生错误回滚事务的才操作
------解决方案--------------------
GOTO在C/SQL里面都不建议使用,在很长的代码里面,goto会导致数据流的混乱,调试起来很麻烦
------解决方案--------------------
你这里有两个部分,一个是处理回滚,一个是处理提交,所以没问题。没有格式化的代码比较难看,看漏了,下面仅帮你格式化而已。
ALTER  PROCEDURE [dbo].[sp_DataComputer_WenYuanDatas]
    @DANo CHAR(32) ,--20110112182345207插入时间
    @DATime DATETIME ,--采集时间
    @LogTime DATETIME ,--更新时间
    @MeterType CHAR(4) ,--表具类型
    @MeterNo CHAR(20) ,--表具号码
    @Qty DECIMAL(18, 6) ,--数值
    @Unit CHAR(4) ,--单位
    @outputpar INT = 0 OUTPUT--输出返回值
AS --带事务存储过程模板


    BEGIN
--开始事务
        BEGIN TRANSACTION
        SAVE TRANSACTION sp_Datacomputer_TRANS

--事务内容,计算时日月数据.
    
        DECLARE @DAYear CHAR(4);
        DECLARE @DAMonth CHAR(2);
        DECLARE @DADay CHAR(2);
        DECLARE @DAHour CHAR(2);

        DECLARE @RowCnt_Year INT;
        DECLARE @RowCnt_Month INT;
        DECLARE @RowCnt_Day INT;
        DECLARE @RowCnt_Hour INT;

        SET @DAYear = SUBSTRING(LTRIM(RTRIM(CONVERT(VARCHAR(10), @DATime, 120))),
                                1, 4);
        SET @DAMonth = SUBSTRING(LTRIM(RTRIM(CONVERT(VARCHAR(10), @DATime, 120))),
                                 6, 2);
        SET @DADay = SUBSTRING(LTRIM(RTRIM(CONVERT(VARCHAR(10), @DATime, 120))),
                               9, 2);
        SET @DAHour = SUBSTRING(LTRIM(RTRIM(CONVERT(VARCHAR(10), @DATime, 114))),
                                1, 2);



        SET @RowCnt_Year = ( SELECT COUNT(*)
                             FROM   WenYuanEnergyDataSumByYear
                             WHERE  MeterNo = @MeterNo
                                    AND MeterType = @MeterType