Erro ao criar a UDF no SQL Server 2005
-
02-07-2019 - |
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?
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.