日期:2014-05-19  浏览次数:20587 次

请教一存储过程 字符拆分的问题 最好不要用函数 送高分! 谢谢
@express   为计算表达式中的数据  
数据类型如下   A+B+C-E-F*D/F.....之类的数据   请问该如何取出各种符号中间的数据   谢谢

CREATE   PROCEDURE   dt_guestroom_income   (@p1   char(2)   output,@p2   datetime)
AS
declare   @line_y   char(3)   --列号
declare   @subj_name   varchar(64)--科目名称
declare   @today_income   numeric   --当天收入
declare   @lastyear_today_income   numeric   --去年同日
declare   @month_income   numeric   --本月收入
declare   @year_income   numeric     --本年收入
declare   @last_time   numeric   --去年同期
declare   @growth_rate   numeric   --增长率
declare   @express   char(128)   --计算表达式
declare   @check     char(1)   --符号表达式
declare   @i   int--位置记数


--declare   @pos   int   --符号位置
declare   @subj_code   varchar(16)
--从科目基础表中查出相应的科目行号,科目名称
delete   from   ht_test_table1

--从表ht_check_report_design中取科目名称和计算表达式
Declare   Cur_tmp     Cursor   For
select   subj_name,express
from   ht_check_report_design
where   code   =@p1

open   Cur_tmp  
Fetch     Next   From   Cur_tmp   into   @subj_name,@express
WHILE   @@FETCH_STATUS   =   0
BEGIN
FETCH   NEXT   FROM   Cur_tmp   into   @subj_name,@express
--判断是@express是否有+,-,*,/,h   等符号

--若为+号则
if   (   CHARINDEX( '+ ',   @express,1)> 0)
----做加法处理   发现+号   拆分前面和后面的数据

                          SET   @i=1
WHILE   @i <=LEN(@express)  
                          BEGIN
  if   (   SUBSTRING   (@express,@i,1)   =   '+ ')
--这里需要拆分标量@express   取出加号和前一个符号前的代码  

                        SET   @i=@i+1
                     
                        END


--若为-号则

if(CHARINDEX( '- ',@express,1)> 0)
       
---做减法处理

--若为*号则
if(CHARINDEX( '* ',@express,1)> 0)
     
---做乘法处理

--若为/号则
if(CHARINDEX( '/ ',@express,1)> 0)
     
---做除法处理

--若为h则
if(CHARINDEX( 'h ',@express,1)> 0)
    print   @subj_name   + '-- '+@express
--做h的处理


END

CLOSE   Cur_tmp
Deallocate   Cur_tmp


--从科目汇总表ht_cash_subj_rep中按科目代码取出符合条件数据
GO


------解决方案--------------------
declare @str varchar(100), @sql varchar(8000)
set @str= 'A+B+C-E-F*D/F '
select @sql= 'select ' ' '
select @sql=@sql+replace(replace(replace(replace(@str, '/ ', ' ' ' union all select ' ' '), '* ', ' ' ' union all select ' ' '), '- ', ' ' ' union all select ' ' '), '+ ', ' ' ' union all select ' ' ')