SQL Server在大文本中定位指定内容

本文介绍了一个自定义SQL函数gf_CharIndex_ex,用于在text或VARCHAR/CHAR类型的数据中精确查找指定字符串的位置。此函数克服了标准charIndex函数不支持text类型的限制,并允许用户自定义起始搜索位置。

--因为一开始不知道 使用PATINDEX可以定位text类型数据,所以写了以下函数进行处理

--注: PATINDEX( '%值%',text列) 值两边的%用法同where 中like 的用法,例如PATINDEX( '%a_b_c%','123abbcc') = 4 

drop function dbo.gf_charindex_ex
go

CREATE FUNCTION dbo.gf_CharIndex_ex  (@IT_DATA TEXT,@IV_FIND VARCHAR(20),@II_START INT=0)
RETURNS int
AS
BEGIN
-------------------------------------------------------------------------
--
-- 该函数用来弥补charIndex函数的不足
--
--参数:
-- @IT_DATA TEXT或者VARCHAR/CHAR类型的文本
-- @IV_FIND 要查找的字符串,20位之内(太长了也没用)
-- @II_START 自定义起始位置,默认为0
-- 
--说明:
-- 该函数可以在一个text文本中定位指定字符串的位置,MSS系统函数charIndex
--函数不支持text类型
--
--创建: Charle 于20070717  olony@163.com
--
--修改: 
--
--使用方法:
-- gf_CharIndex_ex("12345678","45")  return 4
-- gf_CharIndex_ex("aaabb?cc?dd","?",7) return 9
--
--
-- 注意数据会出现 1...7998 abcd 8003 的情况,如果这个时候想获得abcd的位置
--           ^(8000的位置在b处)
--时,简单的截取8000的操作很容易会被跳过,在处理这种情况时函数已经考虑到并做了特
--别处理
--
-------------------------------------------------------------------------

 DECLARE @LV_TEMP VARCHAR(8000);
 DECLARE @LI_POSTION INT;
 DECLARE @LI_LOOP INT;
 
 --循环次数
 SET @LI_LOOP = 0;
 -- 1 * 8000 + 1 = 8001 下一段截取起始位置,下同
 SET @LI_POSTION = @II_START + (@LI_LOOP * 8000) + 1;
 SET @LV_TEMP = SUBSTRING(@IT_DATA,@LI_POSTION,8000)
  
 WHILE (@LV_TEMP IS NOT NULL ) AND LEN(@LV_TEMP) >0
 BEGIN

  SET @LI_POSTION = CHARINDEX( @IV_FIND, @LV_TEMP);

  IF @LI_POSTION > 0
  BEGIN
   IF @LI_LOOP < 1
    RETURN @II_START + (@LI_LOOP * 8000) + @LI_POSTION;
   ELSE
    RETURN @II_START + (@LI_LOOP * 8000) + @LI_POSTION - LEN(@IV_FIND);
  END

  SET @LI_LOOP = @LI_LOOP + 1;
  SET @LI_POSTION = @II_START + (@LI_LOOP * 8000) - LEN(@IV_FIND) + 1; 

  SET @LV_TEMP = SUBSTRING(@IT_DATA,@LI_POSTION,8000);
  
 END;
  
 --搜索到尾了,但是上面还没找到,说明没有
 RETURN 0; 
END
go

--select dbo.gf_CharIndex_ex('123455','34',0)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值