问一个带事宜的存储过程模板?
问一个带事务的存储过程模板???
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_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