質問

で 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)

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

MSG 102、レベル15、状態1、手順を組み合わせた値、10行目の誤った構文の近くの誤った構文。

私の何が間違っているのでしょうか?

役に立ちましたか?

解決

この答えは元の投稿者、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

他のヒント

この方法を使用する場合は注意が必要です。このクエリでは現時点では影響しないかもしれませんが、このメソッドを今後適用する場合はこの点に留意してください。

この問題は、リストに 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 をテストすることで、この潜在的な問題を排除できます。

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

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

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top