3

我正在 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 中使用递归表值函数吗?

我在谷歌搜索,发现标量值递归函数是可能的?

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

感谢任何帮助!

4

2 回答 2

5

回答:

您以错误的方式调用 fnSplit2 。表值函数就是这样:一个“表”……它位于 FROM 子句中的“真实”表所在的位置。

评论:

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

于 2009-06-06T15:40:18.447 回答
1

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

于 2009-06-07T07:46:07.503 回答