• 软件测试技术
  • 软件测试博客
  • 软件测试视频
  • 开源软件测试技术
  • 软件测试论坛
  • 软件测试沙龙
  • 软件测试资料下载
  • 软件测试杂志
  • 软件测试人才招聘
    暂时没有公告

字号: 小 中 大 | 推荐给好友 上一篇 | 下一篇

SQL 中自己创建函数,分割字符串

发布: 2007-7-02 11:08 | 作者: admin | 来源: | 查看: 14次 | 进入软件测试论坛讨论

领测软件测试网  
----------------------------------------------------------------

/**

 *   版权:  石太祥 [ E.Alpha ]   所有 ;

 *

 *   email:     ealpha(AT)msn(DOT)com  ;

 *   msn: ealpha(AT)msn(DOT)com  ;

 *   QQ  : 9690501

 *

 *  所有转载请注明本信息!

 */

----------------------------------------------------------------

if exists (select * from dbo.sysobjects where id = object_id(N@#[dbo].[getEPnum]@#) and xtype in (N@#FN@#, N@#IF@#, N@#TF@#))
drop function [dbo].[getEPnum]
GO

if exists (select * from dbo.sysobjects where id = object_id(N@#[dbo].[getstrcount]@#) and xtype in (N@#FN@#, N@#IF@#, N@#TF@#))
drop function [dbo].[getstrcount]
GO

if exists (select * from dbo.sysobjects where id = object_id(N@#[dbo].[getstrofindex]@#) and xtype in (N@#FN@#, N@#IF@#, N@#TF@#))
drop function [dbo].[getstrofindex]
GO

SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO



---  这个函数直接调用了另外的两个函数,可以先阅读下面提到的两个函数
CREATE   function  getEPnum  (@str  varchar(8000))
returns  varchar(8000)
as
begin
   declare  @str_return  varchar(8000) 
   declare  @i  int
   declare @temp_i int
   declare @onlineornot int
   declare @findepnumok int

  -- 用来取得一个epnum,
  -- 规则:首先从chatid中取,如果有在线得,则取得最前面得在线得返回
  --       如果全部不在线,则返回 ‘00000000’

   select @findepnumok = 0
   select @temp_i = 0
    
   IF len(@str)<=0
      begin
  SELECT @str_return = @#00000000@#
      end
   else
      begin
           select @i = dbo.getstrcount(@str,@#,@#)

    WHILE @temp_i< @i
    BEGIN
              select @onlineornot = online from wwchat_user where epnum=dbo.getstrofindex(@str,@#,@#,@temp_i)           
       IF (@onlineornot=1)
                begin
              select @str_return =dbo.getstrofindex(@str,@#,@#,@temp_i)
       select @findepnumok = 1 --找到epnum后置为1
       BREAK
                end
       ELSE
         begin
       select @temp_i = @temp_i + 1
                     select @findepnumok = 0 --找不到epnum后置为1
         end
    END

          if @findepnumok = 0
               begin
     SELECT @str_return = @#00000000@#
              end
      end
     
   return  @str_return 
end


GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO

         

-- getstrcount  输入一个没有分割的字符串,以及分割符
--返回数组的个数



CREATE     function  getstrcount (@str varchar(8000),@splitstr varchar(100)) 
--returns varchar(8000) 
returns int
as 
begin 
   declare  @int_return int 
   declare  @start  int 
   declare  @next  int 

   declare  @location  int 
 
   select @next = 0
   select @location = 1
 

   if len(@str)<len(@splitstr)
      select @int_return =0
   if charindex(@splitstr,@str) = 0
      select @int_return =0

   while  (@location<>0) 
   begin 
       select  @start  =  @location  + 1 
       select  @location  =  charindex(@splitstr,@str,@start) 
       select  @next  = @next + 1
       select  @int_return = @next

   end 

   return  @int_return
end 

 


GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO



--  getstrofindex  输入一个未分割的字符串,舒服分割符号,舒服要取得的字符位置
-- 返回 制定位置的字符串
CREATE   function  getstrofindex (@str varchar(8000),@splitstr varchar(4),@index int=0) 
returns  varchar(8000) 
as 
begin 
   declare  @str_return  varchar(8000) 
   declare  @start  int 
   declare  @next  int 
   declare  @location  int 

   select  @start =1 
   select  @next = 1  --如果习惯从0开始则select  @next  =0 
   select  @location  =  charindex(@splitstr,@str,@start) 
   while  (@location  <>0  and  @index  >  @next  ) 

   begin 
       select  @start  =  @location  +1 
       select  @location  =  charindex(@splitstr,@str,@start) 
       select  @next  =@next  +1 
   end
 
   if  @location  =0  select  @location  =len(@str)+1  --如果是因为没有逗号退出,则认为逗号在字符串后 
   select  @str_return  =  substring(@str,@start,@location  -@start)  --@start肯定是逗号之后的位置或者就是初始值1 
   if  (@index  <>  @next  )  select  @str_return  =  @#@#  --如果二者不相等,则是因为逗号太少,或者@index小于@next的初始值1。 
 
    return  @str_return 
end 


GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO

 

延伸阅读

文章来源于领测软件测试网 https://www.ltesting.net/


关于领测软件测试网 | 领测软件测试网合作伙伴 | 广告服务 | 投稿指南 | 联系我们 | 网站地图 | 友情链接
版权所有(C) 2003-2010 TestAge(领测软件测试网)|领测国际科技(北京)有限公司|软件测试工程师培训网 All Rights Reserved
北京市海淀区中关村南大街9号北京理工科技大厦1402室 京ICP备2023014753号-2
技术支持和业务联系:[email protected] 电话:010-51297073

软件测试 | 领测国际 | ISTQB | ISTQB官网 | TMMi | TMMi认证 | 国际软件测试工程师认证 | 领测软件测试网