2011-05-08 44 views
4

没有任何一个知道为什么我仍然得到0的结果:CHARINDEX回头率0

SELECT [KnowItAll].[dbo].[VSM_CanculateTermFrequency] (
    'hello hi hello by hello why' 
    ,'hi') 
GO 

其中VSM_CanculateTermFrequency:

CREATE FUNCTION [dbo].[VSM_CanculateTermFrequency] 
(
    @i_Document NCHAR(4000), 
    @i_Term NCHAR(30) 
) 
RETURNS SMALLINT 
AS 
BEGIN 
    -- Declare the return variable here 
    DECLARE @TermFrequency SMALLINT 
    DECLARE @pos    INT 
    DECLARE @nextpos   INT 

    SELECT @pos = 0, @nextpos = 1, @TermFrequency = 0 

    WHILE @nextpos > 0 
    BEGIN 
     SELECT @nextpos = CHARINDEX(@i_Term,@i_Document) 
     SELECT @TermFrequency = CASE 
            WHEN @nextpos > 0 THEN @TermFrequency + 1 
            ELSE @TermFrequency 
           END 
     SELECT @pos = @nextpos 
    END 
    RETURN @TermFrequency 
END 

回答

5

的问题是你的nchar使用。实际上,您并未搜索'hi',您正在搜索

'hi       '
您应该将您的两个参数的数据类型更改为 nvarchar。通过使用 nchar,系统使用空格填充值,以便它变为30或4000个字符。

顺便说一句,我发现与CharIndex无关的另一个问题总是返回零问题(这是由于填充),因为您没有告诉CharIndex在上次找到的术语后搜索。你应该改变你对CHARINDEX电话是:

CHARINDEX(@i_Term,@i_Document,@pos + 1) 

(顺便说一句,我看到加布发现这个第一)

+0

+1 - 填充是问题 – Andrew 2011-05-08 17:02:20

4

一旦你改变你的数据类型为nvarchar,你会发现你有一个无限循环,因为它始终从文档的开头开始搜索。你行应为:

SELECT @nextpos = CHARINDEX(@i_Term,@i_Document, @pos + 1) 
+0

+1 - 和无限循环发生 – Andrew 2011-05-08 17:02:29

+0

是啊这个,我看到的和固定的击打其不是问题 – 2011-05-08 19:04:58