写了一个把字符串按分割符分割成表的函数,看着没问题,就是运行的时候显示查询中,等了很长时间还是查询中,也不报错。求高人指点。
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修改一下再试。