--因为一开始不知道 使用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)