create proc GetAct_Log
(
@startTime datetime,
@endTime datetime,
@acctNo nvarchar(50),
@code_id decimal,
@bol bit                       --是否是代理商 0:非代理商 1:代理商
)
as
declare @str nvarchar(4000)
declare @startTab varchar(50)
declare @endTab varchar(50)
declare @account_id nvarchar(50)
select @account_id = account_id from tab_account where acctNo = @acctNo
set @startTab = 'act_'+cast(datepart(yy,@startTime) as varchar(50))+right('00'+cast(datepart(MM,@startTime) as varchar(50)),2)
set @endTab = 'act_'+cast(datepart(yy,@endTime) as varchar(50))+right('00'+cast(datepart(MM,@endTime) as varchar(50)),2)
drop table temp
select [Name] into temp from dbo.sysobjects  where  type='U' and [Name] like 'act_%' and [Name]>=@startTab and [Name] <=@endTab order by [Name]
declare mycursor cursor for
 select * from temp
open mycursor
declare @Name varchar(50)
fetch next from MyCURSOR into @name
while(@@fetch_status=0)
  begin
    set @str = @str+ 'select account_id,code_id,charge_id,content,paymoney,mac,startTime,endTime from ' +@Name+' where '
if(@bol =1)
begin
set @str = @str + ' account_id like '+char(39)+ @account_id+'%'+char(39)
end
if(@bol=0)
begin
set @str = @str +' account_id = '+char(39)+@account_id+char(39)
end
   set @str = @str + ' and startTime >= convert(datetime,'+char(39)+convert(varchar(20),@startTime)+char(39)+') and endTime <= convert(datetime,'+char(39)+convert(varchar(20),@endTime)+char(39)+')'
if(@code_id <> -1)
  begin 
    set @str = @str + ' and code_id =' +cast(@code_id as varchar(20))
  end
   set @str = @str + ' union '
   print @Name
    fetch next from MyCURSOR into @Name
  end
close MyCURSOR
deallocate MyCURSOR
print @str
set @str = left(@str,len(@str)-5)
set @str = 'select  e.*,f.charge_name  from (select c.*,d.code_name from (select a.*,b.account_name,b.acctNo from ('+@str+') a left join tab_account b on a.account_id = b.account_id ) c left join act_code d on c.code_id = d.code_id )  e left join charge_kind f on e.charge_id = f.charge_id'
exec sp_executesql @str

解决方案 »

  1.   

    在游标里面,@str 是递归相加的, 但是 
    set @str = left(@str,len(@str)-5)
    set @str = 'select  e.*,f.charge_name  from (select c.*,d.code_name from (select a.*,b.account_name,b.acctNo from ('+@str+') a left join tab_account b on a.account_id = b.account_id ) c left join act_code d on c.code_id = d.code_id )  e left join charge_kind f on e.charge_id = f.charge_id'
    exec sp_executesql @str
    这段代码,再次给 @str 赋值,游标里面的递归相加的结果被新值替换掉了,所以没有得到你期望的结果
      

  2.   

    set @str = N'select  e.*,f.charge_name  from (select c.*,d.code_name from (select a.*,b.account_name,b.acctNo from ('+@str+N') a left join tab_account b on a.account_id = b.account_id ) c left join act_code d on c.code_id = d.code_id )  e left join charge_kind f on e.charge_id = f.charge_id'
    exec sp_executesql @str
      

  3.   

    left(@str,len(@str)-5)
    这个地方的@str不就是游标里的值么```我做了处理后赋给新的@str了啊``重点是在
    close MyCURSOR
    deallocate MyCURSOR
    print @str
     
    这里都打印不出想要的@str
    怎么回事``
      

  4.   

    --在定义@str变量后,使用变量与字符串拼接前,应该先赋予初始值,然后再进行拼接。否则结果为null,如:
    declare @str nvarchar(4000)
    set @str=''  --应该加上这句``
    --如果变量没有赋予初始值。和任何字符串拼接都是null,比如:
    declare @str nvarchar(4000)
    set @str=@str+'asfsafd'
    set @str=@str+' bbbbbbb'
    select @str--结果:
    null