我正在尝试确定是的列中的单词频率VARCHAR(3000)。我不确定这是否是最好的数据类型,但是表创建尚未完成。无论如何,我一直在使用以下函数(从此处获取)来拆分字符串,直到现在为止:
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已用尽。
有谁对实现此目标的好方法有建议?
没关系。万一别人面临着同样的问题,从以下这里可以完美运行大型字符串:
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