2011-05-08 43 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