@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
数据类型如下 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
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
/ \
A +
/ \
B -
/ \
C +
/ \
E /
/ \
* F
/ \
F D
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
@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
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)
比如把上面公式处理成下面字符串:然后用:
declare @v int
exec sp_execsql N'@v=1+2+3-4-5*6/7','@v int output',@v=@v output
比如把上面公式处理成下面字符串:
'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
((a+b)/(c+d))/(e-f)
所以处理值,比处理运算符简单得多.
一定要取出来 然后通过这些代码 取到另一个表中的数据 然后对数据进行符号运算
很急 希望大家帮忙解决下 非常感谢