日期:2014-05-18  浏览次数:20473 次

【100分】还是SQL语句优化的问题!!!!!!!
如下这个多次嵌套的语句,
个人觉得有很多问题,
想用GOTO命令进行简化,
又有些担心,
麻烦各位SQL高手给出更好的优化方案
SQL code

begin tran
... ...--执行语句
select @ok = @@ROWCOUNT 
if @ok=0 
    rollback;
else
    begin
        ... ...--执行语句
        select @ok = @@ROWCOUNT
        if @ok=0
            rollback;
        else
            begin
                ... ...--执行语句
                select @ok = @@ROWCOUNT
                if @ok=0
                    rollback;
                else
                    begin
                        ... ...--执行语句
                        select @ok = @@ROWCOUNT
                        if @ok=0
                            rollback;
                        else
                            begin
                                ... ...--执行语句
                                select @ok = @@ROWCOUNT
                                if @ok=0
                                    rollback;
                                else
                                    begin
                                        ... ...--执行语句
                                        select @ok = @@ROWCOUNT
                                        if @ok=0
                                            rollback;
                                        else
                                            begin
                                                if (@isBackCard = 1)
                                                    begin
                                                        if(@type='0')
                                                            begin
                                                                ... ...--执行语句
                                                                select @ok = @@ROWCOUNT
                                                                if @ok=0
                                                                    rollback;
                                                            end
                                                    end
                                            end
                                    end
                            end
                    end
            end
    end
if @@error > 0
    rollback;
else
    commit;



------解决方案--------------------
SQL code

rollback;
return;
--return后就不会执行后面的代码了

------解决方案--------------------
SQL code

begin tran
... ...--执行语句
if @@ROWCOUNT=0 
begin
    rollback
    return
end 
... ...--执行语句
if @@ROWCOUNT=0 
begin
    rollback
    return
end 
... ...--执行语句
if @@ROWCOUNT=0 
begin
    rollback
    return
end 
... ...--执行语句
if @@ROWCOUNT=0 
begin
    rollback
    return
end 
... ...--执行语句

if (@isBackCard = 1)
    if(@type='0')
    begin
         ... ...--执行语句
        if @@ROWCOUNT=0
        begin
            rollback
            return
        end
     end
if @@error > 0
    rollback;
else
    commit;

------解决方案--------------------
楼主的代码只是逻辑有点乱,不方便维护和修改.

至于执行和性能应该没问题.

------解决方案--------------------
我怎么感觉写这代码的人是按照面向过程的思路来写SQL的?
------解决方案--------------------
SQL code

--我简单模拟一下
--先定义一个表变量
declare @t table(id int)

begin tran
insert into @t select 1 --执行语句1
if @@rowcount=0 
rollback;
else
    begin

    insert into @t select 2 --执行语句2
    if @@rowcount=0 
    Rollback Tran;

    insert into @t select 3 --执行语句3
    if @@rowcount=0 
    Rollback Tran;

    insert into @t select 4 where 1<>1 --执行语句4
    if @@rowcount=0 
    Rollback Tran;

    insert into @t select 5 --执行语句5
    if @@rowcount=0 
    Rollback Tran;

    insert into @t select 6 --执行语句6
    if @@rowcount=0 
    Rollback Tran;

    declare @isB