首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

请问一存储过程 字符拆分的有关问题 最好不要用函数 送高分! 多谢

2012-04-12 
请教一存储过程 字符拆分的问题 最好不要用函数 送高分! 谢谢@express为计算表达式中的数据数据类型如下A+

请教一存储过程 字符拆分的问题 最好不要用函数 送高分! 谢谢
@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


热点排行