drop procedure usp_rpt_sale1
go
create procedure usp_rpt_sale1
@date_b char(8), --开始日期
@date_e char(8) --截止日期
as
begin
declare @sqlstr1 varchar(8000), @sqlstr2 varchar(8000)
declare @id int , @name char(20)
select @sqlstr1 = 'select dept_no, '
--声明一个游标,以该游标控制动态语句的生成
declare cursor1 cursor for
select id ,name from ITEMS for read only
open cursor1
fetch cursor1 into @id, @name
select @sqlstr1 = @sqlstr1 + 'sum(case when itemdetail_id = ' + convert(varchar,@id)+ ' then amount else 0 ) as '+ @name + char(13)
fetch cursor1 into @id, @name
while @@fetch_status = 0
begin
select @sqlstr1 = @sqlstr1 + ' , sum(case when itemdetail_id =' + convert(varchar,@id)+ ' then amount else 0 ) as '+ @name + char(13)
fetch cursor1 into @id, @name
end
close cursor1
deallocate cursor1
--print @sqlstr1
select @sqlstr1 = @sqlstr1+ ', sum(amount) as "小计" ' + ' from SALEDETAIL where orderdate between "'+ @date_b + '" and "'+ @date_e + '" group by dept_no '
print @sqlstr1
--exec (@sqlstr1)
end
go
exec usp_rpt_sale1 '20030101','20030101'
--------------------------------------------------------------
在 sybase 12.0 支持动态 sql 的版本上才能运行!
以上是 mssql 2000 版本 ,
如果需要使用,可以改造为 sybase 版本 有几个地方需要注意:
varchar(8000) 可以多声明几个 varchar(255) ,在游标中再加控制,每5个记录 生成一个 sql 语句
运行时 改变为 exec (@sqlstr1+@sqlstr2+@sqlstr3+@sqlstr4)的形式
(原来 mssql 7.0 没有varchar(8000) 我就是这样做的 )
