Pergunta

Eu estou tentando criar uma UDF em SQL Server 2005 Express como abaixo:

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

Culinárias tem a estrutura:

CuisineID INT PK,
Cuisine VARCHAR(20)

Quando tento criar a função como acima, eu recebo um erro:

Msg 102, Nível 15, estado 1, procedimento CombineValues, Linha 10 incorreto sintaxe perto '='.

O que estou fazendo de errado?

Foi útil?

Solução

Esta resposta é do poster original, Wild Thing. Por favor, não votá-lo para cima ou para baixo.

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

Outras dicas

Você precisa ter cuidado ao usar este método. Isso não pode afetá-lo agora, para esta consulta, mas por favor, mantenha isso em mente para futuras aplicações deste método.

O problema ocorre quando você tem um valor NULL em sua lista. Quando isso acontece, você vai obter resultados incorretos.

Por exemplo, se sua tabela original se parece com isso ...

1   Blah
2   NULL
3   Foo
4   Cracker

A sua função retornará Foo, Cracker. O primeiro valor, Blah, não será atingido por esta chamada de função. É muito fácil para acomodar esta, com uma ligeira alteração à sua função, assim ...

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

Ao testar para NOT NULL, você irá eliminar este problema potencial.

tente mudar Selecione para definir e, em seguida, terminar a sua função pelo comando SELECT (ing) sua @CuisineList

Hojou, sua sugestão não funcionou, mas algo similar fez:

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

Gostaria de marcar este como a resposta, mas desde que eu sou o único que fez esta pergunta, eu não estou certo de que este é apropriado? Alguma sugestão? Por favor, sinta a sensação de comentário.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top