3

SQL Server 2005 で分割関数を作成しています。

while loop を使用して既に実行しています。

しかし、私はそれで満足していません。再帰関数を使ってやりたい。

私はすでに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 で再帰テーブル値関数を使用できませんか?

Googleで検索したところ、スカラー値の再帰関数が可能であることがわかりましたか?

コードを提供すると同時に、私が犯している間違いを教えてください.

どんな助けにも感謝します!

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 に答える