0

以下のようにUDFを作成しようとしてSQL Server 2005 Expressいます:

CREATE FUNCTION [CombineValues] ()
RETURNS VARCHAR(8000)
AS
BEGIN

DECLARE @CuisineList VARCHAR(8000);

RETURN 
    (
    SELECT @CuisineList = COALESCE(@CuisineList + ', ', '') + 
        CAST(Cuisine AS varchar(20))
    FROM Cuisines
    )
END

料理の構造は次のとおりです。

CuisineID INT PK,
Cuisine VARCHAR(20)

上記の関数を作成しようとすると、エラーが発生します。

メッセージ 102、レベル 15、状態 1、プロシージャ CombineValues、行 10 '=' 付近の構文が正しくありません。

私は何を間違っていますか?

4

4 に答える 4

1

この方法を使用するときは注意が必要です。このクエリでは、これは今のところ影響しないかもしれませんが、このメソッドの将来のアプリケーションのためにこれを覚えておいてください。

この問題は、リストにNULL値がある場合に発生します。これが発生すると、誤った結果が得られます。

たとえば、元のテーブルが次のようになっている場合...

1   Blah
2   NULL
3   Foo
4   Cracker

関数はFoo、Crackerを返します。最初の値であるBlahは、この関数呼び出しでは失われます。このように機能を少し変更するだけで、これに対応するのは非常に簡単です...

CREATE FUNCTION [CombineValues] ()
RETURNS VARCHAR(8000)
AS
BEGIN

DECLARE @CuisineList VARCHAR(8000);
    SELECT @CuisineList = COALESCE(@CuisineList + ', ', '') + 
        CAST(Cuisine AS varchar(20))
    FROM Cuisines
    WHERE Cuisine Is Not NULL

RETURN @CuisineList
END

NOT NULLをテストすることにより、この潜在的な問題を排除します。

于 2008-09-21T22:47:30.527 に答える
0

SELECT を SET に変更してから、@CuisineList を SELECT (ing) して関数を終了してみてください

于 2008-09-21T17:39:05.120 に答える
0

北条さん、あなたの提案はうまくいきませんでしたが、同様のことができました:

CREATE FUNCTION [CombineValues] ()
RETURNS VARCHAR(8000)
AS
BEGIN

DECLARE @CuisineList VARCHAR(8000);

SELECT @CuisineList = COALESCE(@CuisineList + ', ', '') + CAST(Cuisine AS varchar(20)) FROM Cuisines;

RETURN 
(
SELECT @CuisineList
)
END

これを回答としてマークしたいのですが、この質問をしたのは私なので、これが適切かどうかわかりませんか? 助言がありますか?気軽にコメントしてください。

于 2008-09-21T17:43:34.483 に答える
0

この回答は、元のポスターである Wild Thing からのものです。賛成または反対に投票しないでください。

CREATE FUNCTION [CombineValues] ()
RETURNS VARCHAR(8000)
AS
BEGIN

DECLARE @CuisineList VARCHAR(8000);

SELECT @CuisineList = COALESCE(@CuisineList + ', ', '') + CAST(Cuisine AS varchar(20)) FROM Cuisines;

RETURN 
(
SELECT @CuisineList
)
END
于 2008-09-21T18:17:49.083 に答える