如何在SQL SERVER 2005中使用递归表值函数

时间:2009-06-06 15:09:12

标签: sql sql-server-2005 tsql recursion user-defined-functions

我在SQL Server 2005中创建了一个split函数。

我已经通过使用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

错误是: Msg 102,Level 15,State 1,Procedure fnSplit2,Line 38 'fnSplit2'附近的语法不正确。

我不能在SQL SERVER中使用递归表值函数吗?

我在谷歌搜索并发现Scalar值得递归函数是可能的吗?

请提供代码,同时告诉我我犯的错误。

感谢任何帮助!

2 个答案:

答案 0 :(得分:5)

答案:

你以错误的方式调用fnSplit2。一个表值函数就是这样的:一个“表”......它就是一个“真正的”表将进入FROM子句的地方。

注释:

如果确实必须在SQL中拆分CSV,请以各种方式阅读Erland Sommarskog's article以正确执行此操作。请注意,他没有列出递归的TVF方法......

答案 1 :(得分:1)

此外,您可能还需要在引用中使用模式名称:“dbo.fnSplit2(..)”。如前所述,将其用作表格参考。