declare @StartDate       smalldatetime
declare @EndDate       smalldatetime
declare @computName  nvarchar(50)
declare @Vouchtype      nvarchar(12)
set @StartDate='2010-05-01'
set @EndDate='2010-05-31'
set @computName='fht'
set @Vouchtype='01'
declare @Str_Query  nvarchar(2000)
declare @Str_Query2     nvarchar(1000)
declare @Str_Query3     nvarchar(1000)
declare @JHdate smalldatetime
set @Str_Query='select a.Vouchtype, a.CCode, a.CustomerCode, c.customername,a.DDate,a.Productcode,b.productname,b.model,b.unit'
--计算case left(cRdCode,3)  N'18' then (case when iAInQuantity is null then 0 else iAInQuantity end) else 0 end AS N'18数量',
declare CTJHjs cursor local forward_only for
select DISTINCT jhdate from ctsubsidiary
open CTJHjs
fetch next from CTJHjs into @JHdate
while @@fetch_status=0
    begin
set @Str_Query2=@Str_Query2 + ',case a.jhdate when '+convert(varchar(30),@JHdate,120) + ' then (case when bhnumber is null then 0 else bhnumber end) else 0 end as ' + convert(varchar(30),@JHdate,120)
fetch next from CTJHjs into @JHdate
    End
Close CTJHjs
DEALLOCATE CTJHjs
set @Str_Query3='   into tmpctjs'+@computName +'   from ctsubsidiary a left join haierproductarchives b on a.productCode=b.productCode left join customerarchives c ON a.customercode = c.customercode  Where a.cVouType= N' + @Vouchtype +
'  and a.ddate>=' + convert(varchar(30),@StartDate,120) +' and a.ddate<='+ convert(varchar(30),@endDate,120) exec (@Str_Query+@Str_Query2+@Str_Query3)

解决方案 »

  1.   


    declare @StartDate smalldatetime
    declare @EndDate smalldatetime
    declare @computName nvarchar(50)
    declare @Vouchtype nvarchar(12)
    set @StartDate='2010-05-01'
    set @EndDate='2010-05-31'
    set @computName='fht'
    set @Vouchtype='01'
    declare @Str_Query nvarchar(2000)
    declare @Str_Query2 nvarchar(1000)
    declare @Str_Query3 nvarchar(1000)
    declare @JHdate smalldatetime
    set @Str_Query='select a.Vouchtype, a.CCode, a.CustomerCode, c.customername,a.DDate,a.Productcode,b.productname,b.model,b.unit'
    --计算case left(cRdCode,3) N'18' then (case when iAInQuantity is null then 0 else iAInQuantity end) else 0 end AS N'18数量',
    declare CTJHjs cursor local forward_only for
    select DISTINCT jhdate from ctsubsidiary
    open CTJHjs
    fetch next from CTJHjs into @JHdate
    while @@fetch_status=0
      begin
    set @Str_Query2=@Str_Query2 + ',case a.jhdate when '''+convert(varchar(30),@JHdate,120) + ''' then (case when bhnumber is null then 0 else bhnumber end) else 0 end as ' + QUOTENAME(convert(varchar(30),@JHdate,120))
    fetch next from CTJHjs into @JHdate
      End
    Close CTJHjs
    DEALLOCATE CTJHjs
    set @Str_Query3=' into tmpctjs'+@computName +' from ctsubsidiary a left join haierproductarchives b on a.productCode=b.productCode left join customerarchives c ON a.customercode = c.customercode Where a.cVouType= N' + @Vouchtype +
    ' and a.ddate>=''' + convert(varchar(30),@StartDate,120) +''' and a.ddate<='''+ convert(varchar(30),@endDate,120)+'''' exec (@Str_Query+@Str_Query2+@Str_Query3)
    改完试试
      

  2.   

    动态SQL,估计是组合不当,参考
    --动态sql语句基本语法
     
    1 :普通SQL语句可以用Exec执行 eg: Select * from tableName 
    Exec('select * from tableName') 
    Exec sp_executesql N'select * from tableName' -- 请注意字符串前一定要加N 2:字段名,表名,数据库名之类作为变量时,必须用动态SQL eg: 
    declare @fname varchar(20) 
    set @fname = 'FiledName' 
    Select @fname from tableName -- 错误,不会提示错误,但结果为固定值FiledName,并非所要。 
    Exec('select ' + @fname + ' from tableName') -- 请注意 加号前后的 单引号的边上加空格 当然将字符串改成变量的形式也可 
    declare @fname varchar(20) 
    set @fname = 'FiledName' --设置字段名 declare @s varchar(1000) 
    set @s = 'select ' + @fname + ' from tableName' 
    Exec(@s) -- 成功 
    exec sp_executesql @s -- 此句会报错 declare @s Nvarchar(1000) -- 注意此处改为nvarchar(1000) 
    set @s = 'select ' + @fname + ' from tableName' 
    Exec(@s) -- 成功 
    exec sp_executesql @s -- 此句正确 3. 输出参数 
    declare @num int, 
    @sqls nvarchar(4000) 
    set @sqls='select count(*) from tableName' 
    exec(@sqls) 
    --如何将exec执行结果放入变量中? declare @num int, 
    @sqls nvarchar(4000) 
    set @sqls='select @a=count(*) from tableName ' 
    exec sp_executesql @sqls,N'@a int output',@num output 
    select @num