[Syteline]动态参数的存储过程

由于实际开发过程中需要用到动态的改变 SQL语句.
动态列,动态条件限制
create procedure name(

  @para 1...

  @para.2..

  ....

)

begin

 declare @sql='select * from tbname where ...'

 set @sql=@sql+

        case when <condi..> then '..'else ' and col=@para1' end

        .....

 EXEC (@sql)

end

在做试算平衡表的过程中

我的写法: 

Create Procedure UF_Rpt_Trialbalance(

         @site           nvarchar(8)=null

,@Staringyear    nvarchar(4)=null

        ,@Endingyear     nvarchar(4)=null

        ,@Staringmonth   nvarchar(2)=null

        ,@Endingmonth    nvarchar(2)=null

        ,@u1       bit

        ,@u2       bit

        ,@u3       bit

        ,@u4       bit

)

As

declare

        @u1       bit

        ,@u2       bit

        ,@u3       bit

        ,@u4       bit

set        @u1       =1

set        @u2       =1

set        @u3       =1

set        @u4       =1

--------------------------declare------------------------

declare @uf_fileds varchar(200)

       ,@sql varchar(2000)

set @uf_fileds='acct'

if @u1=1

   set @uf_fileds=@uf_fileds+',acct_unit1'

if @u2=1

   set @uf_fileds=@uf_fileds+',acct_unit2'

if @u3=1

   set @uf_fileds=@uf_fileds+',acct_unit3'

if @u4=1

   set @uf_fileds=@uf_fileds+',acct_unit4'




/*

*/

set @sql=

'SELECT j.acct'+case when @u1=1 then ',j.acct_unit1' else '' end 

             +case when @u2=1 then ',j.acct_unit2' else '' end

             +case when @u3=1 then ',j.acct_unit3' else '' end

             +case when @u4=1 then ',j.acct_unit4' else '' end




        +',e.dom_amount_p,d.dom_amount_Debit,b.dom_amount_Credit from '

+'(SELECT '+@uf_fileds

+'  FROM journal '

+'  group by '+@uf_fileds+') j'


+' left join (SELECT '+@uf_fileds+',sum(dom_amount) as dom_amount_p '

+'  FROM journal '

+'  where control_site=''SHAT'' AND control_year<=''2008'' AND control_period<''10'''

+'  group by '+@uf_fileds+') e '

+'      on e.acct=j.acct'

             +case when @u1=1 then ' and e.acct_unit1=j.acct_unit1' else '' end 

             +case when @u2=1 then ' and e.acct_unit2=j.acct_unit2' else '' end 

             +case when @u3=1 then ' and e.acct_unit3=j.acct_unit3' else '' end 

             +case when @u4=1 then ' and e.acct_unit4=j.acct_unit4' else '' end 

+' left join (SELECT '+@uf_fileds+',sum(dom_amount) as dom_amount_Debit  '

+'  FROM journal'

+'  where control_site=''SHAT'' AND control_year=''2008'' AND control_period=''10''and dom_amount<0'

+'  group by '+@uf_fileds+' ) d'

+'        on j.acct=d.acct'

             +case when @u1=1 then ' and j.acct_unit1=d.acct_unit1' else '' end 

             +case when @u2=1 then ' and j.acct_unit2=d.acct_unit2' else '' end 

             +case when @u3=1 then ' and j.acct_unit3=d.acct_unit3' else '' end 

             +case when @u4=1 then ' and j.acct_unit4=d.acct_unit4' else '' end 




+' left join (SELECT '+@uf_fileds+',sum(dom_amount) as dom_amount_Credit '

+'  FROM journal'

+'  where control_site=''SHAT'' AND control_year=''2008'' AND control_period=''10'' AND dom_amount>0'

+'  group by '+@uf_fileds+') B '

+'        ON j.acct=b.acct'

             +case when @u1=1 then ' and j.acct_unit1=b.acct_unit1' else '' end 

             +case when @u2=1 then ' and j.acct_unit2=b.acct_unit2' else '' end 

             +case when @u3=1 then ' and j.acct_unit3=b.acct_unit3' else '' end 

             +case when @u4=1 then ' and j.acct_unit4=b.acct_unit4' else '' end 

print @sql




我们老大的写法:


CREATE PROCEDURE dbo.UF_CreateLedgerTmpTableSp ( 

 @acct as nvarchar(10)=null

,@unit1 as nvarchar(30)=null

,@unit2 as nvarchar(30)=null

,@unit3 as nvarchar(30)=null

,@unit4 as nvarchar(30)=null

,@su1 as bit=0

,@su2 as bit=0

,@su3 as bit=0

,@su4 as bit=0

,@year as int=null

,@period as int=null

,@unposted as bit=0

,@LocalId as varchar(50)=null

)as 

begin


Declare

 @sql nvarchar(4000)

,@groupby nvarchar(1000)

,@table nvarchar(2000)


  set @groupby='acct'

  if @su1=1

    set @groupby=@groupby + ',acct_unit1'

  if @su2=1

    set @groupby=@groupby + ',acct_unit2'

  if @su3=1

    set @groupby=@groupby + ',acct_unit3'

  if @su4=1

    set @groupby=@groupby + ',acct_unit4'

 
  set @table='Ledger'

  if @unposted=1 

    set @table='(select acct,acct_unit1,acct_unit2,acct_unit3,acct_unit4,curr_code,for_amount,dom_amount,control_year,control_period,from_id from ledger

                union

                select acct,acct_unit1,acct_unit2,acct_unit3,acct_unit4,curr_code,for_amount,dom_amount,control_year,control_period,id as from_id from journal) a'

  set @sql=

'select ' + @groupby + ',curr_code

,sum(case when (for_amount>=0 and control_year=' + str(@year) + ' and control_period= ' + str(@period) + ') then isnull(for_amount,0) else 0 end) as foramt_dr

,sum(case when (for_amount<0 and control_year=' + str(@year) + ' and control_period= ' + str(@period) + ') then isnull(for_amount,0) else 0 end) as foramt_cr

,sum(case when (dom_amount>=0 and control_year=' + str(@year) + ' and control_period= ' + str(@period) + ') then isnull(dom_amount,0) else 0 end) as domamt_dr

,sum(case when (dom_amount<0 and control_year=' + str(@year) + ' and control_period= ' + str(@period) + ') then isnull(dom_amount,0) else 0 end) as domamt_cr

,sum(case when (control_year<=' + str(@year) + ' and control_period<=' + str(@period) + ') then isnull(for_amount,0) else 0 end) as end_foramt

,sum(case when (control_year<=' + str(@year) + ' and control_period<=' + str(@period) + ') then isnull(dom_amount,0) else 0 end) as end_domamt

 into uf_tmp

 from ' + @table +'

 where acct='+ isnull(@acct,'acct') + ' 

 and from_id=' + isnull(@Localid,'from_id') + '

 and isnull(acct_unit1,1)=' + isnull(@unit1, 'isnull(acct_unit1,1)') + '

 and isnull(acct_unit2,1)=' + isnull(@unit2, 'isnull(acct_unit2,1)') + '

 and isnull(acct_unit3,1)=' + isnull(@unit3, 'isnull(acct_unit3,1)') + '

 and isnull(acct_unit4,1)=' + isnull(@unit4, 'isnull(acct_unit4,1)') + '

 group by ' + @groupby + ',curr_code'

IF object_id('[dbo].uf_tmp') IS NOT NULL --判断临时表#tmp是否存在,存在则删除

            drop table uf_tmp
EXEC (@sql)

select * from uf_tmp

end

GO




明显感觉到自己不够简洁,代码繁琐,效率不高.希望后续多多提高..



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

厦门德仔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值