当前位置: 代码迷 >> Sql Server >> t-sql 字符串分割函数解决方法
  详细解决方案

t-sql 字符串分割函数解决方法

热度:101   发布时间:2016-04-24 10:39:49.0
t-sql 字符串分割函数
写了一个把字符串按分割符分割成表的函数,看着没问题,就是运行的时候显示查询中,等了很长时间还是查询中,也不报错。求高人指点。
CREATE FUNCTION Split
(
@str VARCHAR(MAX),
@separator VARCHAR(50)
)
RETURNS @T TABLE 
(
Id INT IDENTITY(1,1),
Value VARCHAR(50)
)
AS
BEGIN
DECLARE @start INT, @end INT, @sepLen INT, @subLen INT, @len INT, @temp VARCHAR(50)
SET @start = 1
SET @len = LEN(@str)
SET @sepLen = LEN(@separator)
WHILE(@start <= @len)
SET @end = CASE WHEN '' = @separator THEN @start WHEN 0 < CHARINDEX(@str, @separator, @start) THEN CHARINDEX(@str, @separator, @start) - 1 ELSE LEN(@str) END
SET @subLen = @end - @start + 1
INSERT INTO @T VALUES (SUBSTRING(@str, @start, @subLen))
SET @start = @end + @sepLen + 1
RETURN
END
------解决方案--------------------
参考:

/*
DROP FUNCTION dbo.Split
SELECT * from dbo.Split(@s,';')
*/
CREATE FUNCTION dbo.Split
(
@SplitString varchar(8000),-- nvarchar(4000)
@Separator varchar(2) = ','
)
RETURNS @SplitStringsTable TABLE
(
[id] int identity(1,1),
[value] varchar(8000)-- nvarchar(4000)
)
AS
BEGIN
    DECLARE @CurrentIndex int;
    DECLARE @NextIndex int;
    DECLARE @ReturnText varchar(8000);-- nvarchar(4000)
    SELECT @CurrentIndex=1;
    WHILE(@CurrentIndex<=len(@SplitString))
    BEGIN
        SELECT @NextIndex=charindex(@Separator,@SplitString,@CurrentIndex);
        IF(@NextIndex=0 OR @NextIndex IS NULL)
            SELECT @NextIndex=len(@SplitString)+1;
       
        SELECT @ReturnText=substring(@SplitString,@CurrentIndex,@NextIndex-@CurrentIndex);

        INSERT INTO @SplitStringsTable([value])
        VALUES(@ReturnText);
       
        SELECT @CurrentIndex=@NextIndex+1;
    END
    RETURN;
END

------解决方案--------------------

-- LZ 的代码中有两处明显的错误。
1.  while 的语法问题,如果有多条语句必须使用 begin end ,如果没有使用则只执行 while 下面的一条。
while (,,,,,,,,,)
begin
-- 你的语句
end 
--你在这里没有写 begin end , 所以只执行,这一句。死循环了。
SET @end = CASE WHEN '' = @separator THEN @start WHEN 0 < CHARINDEX(@str, @separator, @start) THEN CHARINDEX(@str, @separator, @start) - 1 ELSE LEN(@str) END

2. charindex 的语法问题
charindex(短串,长串,起始位置) 

-- 你好象把长短串写反了,别的没有看出来,LZ修改一下再试。
  相关解决方案