请教一存储过程 字符拆分的问题 最好不要用函数 送高分! 谢谢
@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 ' ' ')+ ' ' ' '
--print @sql
exec(@sql)
--result
----
A
B
C
E
F
D
F
[解决办法]
老大写的一个字符串拆分函数
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
[解决办法]
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