2009-06-06 91 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(..)”。如前所述,将其用作表格参考。