@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 =@p1open 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的处理
ENDCLOSE Cur_tmp
Deallocate Cur_tmp--从科目汇总表ht_cash_subj_rep中按科目代码取出符合条件数据
GO

解决方案 »

  1.   

    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 ''')+''''
    --print @sql
    exec(@sql)
    --result
         
    ---- 
    A
    B
    C
    E
    F
    D
    F
      

  2.   

    A+B+C-E-F*D/F  +
     / \
    A   +
       / \
      B   -
         / \
        C   +
           / \
          E   /
             / \
            *   F
           / \
          F   D
      

  3.   

    老大写的一个字符串拆分函数if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[f_splitSTR]') and xtype in (N'FN', N'IF', N'TF'))
    drop function [dbo].[f_splitSTR]
    GO/*--字符串拆分函数分拆指定分隔符的的字符串,返回指定位置的字符--邹建 2004.04(引用请保留此信息)--*//*--调用示例SELECT 
    dbo.f_splitSTR(userinfo,'|||', 1) as 姓名,
    dbo.f_splitSTR(userinfo,'|||', 2) as 性格,
    dbo.f_splitSTR(userinfo,'|||', 3) as 手机,
    dbo.f_splitSTR(userinfo,'|||', 4) as 地址,
    dbo.f_splitSTR(userinfo,'|||', 5) as 其他
    FROM(
    SELECT userinfo = '张三|||温和|||手机|||通讯地址'
    )A
    --*/
    CREATE FUNCTION dbo.f_splitSTR(
    @s varchar(8000),   --要分拆的字符串
    @split varchar(10), --数据分隔符
    @pos int            -- 取第几个
    )RETURNS varchar(100)
    AS
    BEGIN
    DECLARE @splitlen int, @re varchar(100)
    SET @splitlen=LEN(@split+'a') - 2
    WHILE CHARINDEX(@split,@s) > 0 AND @pos > 0
    SELECT
    @re = LEFT(@s,CHARINDEX(@split,@s)-1),
    @s=STUFF(@s,1,CHARINDEX(@split, @s)+@splitlen,''),
    @pos = @pos - 1
    RETURN(CASE 
    WHEN @pos = 0 THEN @re 
    WHEN @pos = 1 THEN @s
    ELSE NULL END)
    END
    GO-- 调用
    SELECT 
    dbo.f_splitSTR(userinfo,'|||', 1) as 姓名,
    dbo.f_splitSTR(userinfo,'|||', 2) as 性格,
    dbo.f_splitSTR(userinfo,'|||', 3) as 手机,
    dbo.f_splitSTR(userinfo,'|||', 4) as 地址,
    dbo.f_splitSTR(userinfo,'|||', 5) as 其他
    FROM(
    SELECT userinfo = '张三|||温和|||手机|||通讯地址'
    )A
      

  4.   

    CREATE FUNCTION dbo.f_splitSTR(
    @s varchar(8000),   --要分拆的字符串
    @split varchar(10), --数据分隔符
    @pos int            -- 取第几个
    )RETURNS varchar(100)
    AS
    BEGIN
    DECLARE @splitlen int, @re varchar(100)
    SET @splitlen=LEN(@split+'a') - 2
    WHILE CHARINDEX(@split,@s) > 0 AND @pos > 0
    SELECT
    @re = LEFT(@s,CHARINDEX(@split,@s)-1),
    @s=STUFF(@s,1,CHARINDEX(@split, @s)+@splitlen,''),
    @pos = @pos - 1
    RETURN(CASE 
    WHEN @pos = 0 THEN @re 
    WHEN @pos = 1 THEN @s
    ELSE NULL END)
    END
    GO
    declare @str varchar(100)
    set @str='A+B+C-E-F*D/F'
    select dbo.f_splitSTR(t.aa,'+',1) c1 ,
    dbo.f_splitSTR(t.aa,'+',2) c2,
    dbo.f_splitSTR(t.aa,'+',3) c3,
    dbo.f_splitSTR(t.aa,'+',4) c4,
    dbo.f_splitSTR(t.aa,'+',5) c5,
    dbo.f_splitSTR(t.aa,'+',6) c6,
    dbo.f_splitSTR(t.aa,'+',7) c7
    from (select replace(replace(replace(@str,'-','+'),'*','+'),'/','+') aa ) t
      

  5.   

    --改自鄒老大的方法create function f_splitSTR(@s varchar(8000))
    returns @re table(split varchar(10), value varchar(100))
    as
    begin
    declare @splits table(split varchar(10), splitLen as len(split))
    insert @splits(split) select '+'
    union all select '-'
    union all select '*'
    union all select '/'

    declare @pos1 int, @pos2 int, @split varchar(10), @splitLen int
    select top 1 
    @pos1=1, @split=split, @splitLen=splitLen
    from @splits where @s like split+'%'

    while @pos1>0
    begin
    select top 1 @pos2=charindex(split, @s, @splitLen+1)
    from @splits
    where charindex(split, @s, @splitLen+1)>0
    order by charindex(split, @s, @splitLen+1) if @@rowcount=0
    begin
    insert @re values(@split, stuff(@s, 1, @splitLen, ''))
    return
    end
    else
    begin
    insert @re values(@split, substring(@s, @splitLen+1, @pos2-@splitLen-1))
    select top 1
    @pos1=1, @split=split, @splitLen=splitLen, @s=stuff(@s, 1, @pos2-1, '')
    from @splits
    where stuff(@s, 1, @pos2-1, '') like split+'%'
    end end return 
    end--
    declare @str varchar(100)
    set @str='A+B+C-E-F*D/F'
    set @str='+'+@str
    select * from f_splitSTR(@str)--result
    split      value                                                                                                
    ---------- ---------------------------------------------------------------------------------------------------- 
    +          A
    +          B
    +          C
    -          E
    -          F
    *          D
    /          F(7 row(s) affected)
      

  6.   

    A+B+C-E-F*D/F.....象这种公式处理.各位方法都很精良.但解决方案不对头.对SQLserver来说,不应处理运算符.应该处理的是ABCDEF的值.
    比如把上面公式处理成下面字符串:然后用:
    declare @v int
    exec sp_execsql N'@v=1+2+3-4-5*6/7','@v int output',@v=@v output
      

  7.   

    对SQLserver来说,不应处理运算符.应该处理的是ABCDEF的值.
    比如把上面公式处理成下面字符串:
    '1+2+3-4-5*6/7'
    然后用:
    declare @v int
    exec sp_execsql N'@v=1+2+3-4-5*6/7','@v int output',@v=@v output
      

  8.   

    因为运算公式复杂程度,有时不好估计. 也许会出现如:
    ((a+b)/(c+d))/(e-f)
    所以处理值,比处理运算符简单得多.
      

  9.   

    8楼的回复我看了 可是现在那样做解决不了问题 实际上 A、B、C、D...都是另一个表中的科目代码
    一定要取出来 然后通过这些代码 取到另一个表中的数据 然后对数据进行符号运算
    很急 希望大家帮忙解决下 非常感谢
      

  10.   

    谢谢 leo_lesley 和 marco08(天道酬勤) 你们的方法是对的 我再好好看看 散分
      

  11.   

    marco08(天道酬勤)方便留个联系方式吗?加个好友 还有点小问题请教 谢谢