一尘不染

使用自定义定界符分割非常大的字符串?

sql

我正在尝试确定是的列中的单词频率VARCHAR(3000)。我不确定这是否是最好的数据类型,但是表创建尚未完成。无论如何,我一直在使用以下函数(从此处获取)来拆分字符串,直到现在为止:

CREATE FUNCTION dbo.Split
(
    @RowData nvarchar(2000),
    @SplitOn nvarchar(5)
)  
RETURNS @RtnValue table 
(
    Id int identity(1,1),
    Data nvarchar(100)
) 
AS  
BEGIN 
    Declare @Cnt int
    Set @Cnt = 1

    While (Charindex(@SplitOn,@RowData)>0)
    Begin
        Insert Into @RtnValue (data)
        Select 
            Data = ltrim(rtrim(Substring(@RowData,1,Charindex(@SplitOn,@RowData)-1)))

        Set @RowData = Substring(@RowData,Charindex(@SplitOn,@RowData)+1,len(@RowData))
        Set @Cnt = @Cnt + 1
    End

    Insert Into @RtnValue (data)
    Select Data = ltrim(rtrim(@RowData))

    Return
END

用法如下:

SELECT s FROM dbo.Split(' ', @description)

它一直运行得很好,但是现在我遇到了一个错误:

声明终止。在语句完成之前,最大递归100已用尽。

有谁对实现此目标的好方法有建议?


阅读 114

收藏
2021-05-16

共1个答案

一尘不染

没关系。万一别人面临着同样的问题,从以下这里可以完美运行大型字符串:

CREATE FUNCTION dbo.SplitLarge(@String varchar(8000), @Delimiter char(1))     
returns @temptable TABLE (items varchar(8000))     
as     
begin     
    declare @idx int     
    declare @slice varchar(8000)

    select @idx = 1     
        if len(@String)<1 or @String is null  return

    while @idx!= 0     
    begin     
        set @idx = charindex(@Delimiter,@String)     
        if @idx!=0     
            set @slice = left(@String,@idx - 1)     
        else     
            set @slice = @String

        if(len(@slice)>0)
            insert into @temptable(Items) values(@slice)

        set @String = right(@String,len(@String) - @idx)     
        if len(@String) = 0 break     
    end 
return     
end
2021-05-16