Erreur lors de la création de la fonction utilisateur dans SQL Server 2005
-
02-07-2019 - |
Question
J'essaie de créer une UDF dans SQL Server 2005 Express
comme ci-dessous:
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
Cuisines a la structure:
CuisineID INT PK,
Cuisine VARCHAR(20)
Lorsque j'essaie de créer la fonction comme ci-dessus, un message d'erreur s'affiche:
Msg 102, niveau 15, état 1, procédure CombineValues, ligne 10 incorrecte syntaxe proche de '='.
Qu'est-ce que je fais de travers?
La solution
Cette réponse provient de l’affiche originale, Wild Thing. Veuillez ne pas voter à la hausse ou à la baisse.
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
Autres conseils
Vous devez faire attention lorsque vous utilisez cette méthode. Cela ne vous concerne peut-être pas maintenant, mais gardez cela à l'esprit pour les applications futures de cette méthode.
Le problème se produit lorsque vous avez une valeur NULL dans votre liste. Lorsque cela se produit, vous obtiendrez des résultats incorrects.
Par exemple, si votre table d'origine ressemble à ceci ...
1 Blah
2 NULL
3 Foo
4 Cracker
Votre fonction retournera Foo, Cracker. La première valeur, Blah, sera manquée par cet appel de fonction. Il est très facile d’y répondre, avec une légère modification de votre fonction, comme ceci ...
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
En testant NOT NULL, vous éliminerez ce problème potentiel.
essayez de changer SELECT en SET puis finissez votre fonction en SELECT (ing) votre @CuisineList
Hojou, votre suggestion n'a pas fonctionné, mais quelque chose de similaire a fonctionné:
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
Je voudrais marquer ceci comme réponse, mais comme je suis celui qui a posé cette question, je ne suis pas sûr que cela convienne? Aucune suggestion? S'il vous plaît n'hésitez pas à commenter.