2009-06-06 90 views
1

我在SQL Server 2005中進行分割函數。如何在SQL SERVER 2005中使用遞歸表值函數

我已經通過使用while循環完成了它。

但我對此並不滿意。我想用遞歸函數來做。

我已經在C#中完成了它。 現在我在SQL SERVER 2005中繪製了相同的圖表,但是我收到了一個編譯錯誤。

這裏是我的代碼

ALTER FUNCTION [dbo].[fnSplit2] 
(

    @OLDSTRING AS VARCHAR(100), 
    @DELIMETER AS VARCHAR(1) 
) 

RETURNS @MYTABLE TABLE(COUNTER INT,STRINGVAL VARCHAR(100)) 
    AS 
     Begin 

      DECLARE @NEWSTRING AS VARCHAR(100) 
      DECLARE @POS AS INT 
      DECLARE @LEN AS INT 
      DECLARE @COUNTER AS INT 

      SET @NEWSTRING = '';   
      SET @LEN = LEN(@OLDSTRING) 
      SET @COUNTER = 0 
      SET @POS = CHARINDEX(@DELIMETER, @OLDSTRING) 

      IF(@POS > 0) 

       BEGIN 

        SET @COUNTER = @COUNTER +1 

        INSERT INTO @MYTABLE(COUNTER,STRINGVAL) VALUES(@COUNTER,@NEWSTRING + SUBSTRING(@OLDSTRING,0, @POS)) 
        SET @OLDSTRING = SUBSTRING(@OLDSTRING,0, @POS) 
        fnSplit2(@OLDSTRING,@DELIMETER); 

       END 

      ELSE 

       BEGIN 
        SET @COUNTER = @COUNTER +1 
        INSERT INTO @MYTABLE(COUNTER,STRINGVAL) values(@COUNTER,@OLDSTRING) 
       END 

    RETURN 
END 

的錯誤是: 消息102,級別15,狀態1,過程fnSplit2 38行 附近有語法錯誤fnSplit2「。

我不能在SQL SERVER中使用遞歸表值函數嗎?

我在谷歌搜索,發現標量值的遞歸函數是可能的?

請提供代碼並同時告訴我我正在犯的錯誤。

感謝您的幫助!

+1

爲什麼世界上你會從迭代版本切換到遞歸版本?所以你不僅會招致更多的內存開銷,而且我們不要忘記你正在運行這個* IN * SQL SERVER>。 – 2009-06-06 15:18:28

回答

5

答案:

您以錯誤的方式調用fnSplit2。一個表值函數就是這樣的:一個「表」......它就是一個「真實」表在FROM子句中的位置。

評論:

如果你真的必須在SQL分裂CSV中,對不同的方式閱讀Erland Sommarskog's article正確地做到這一點。注意他沒有列出遞歸TVF方法...

1

此外,您可能還需要在引用中使用模式名稱以及:「dbo.fnSplit2(..)」。如前所述,將其用作表格參考。