Error al crear UDF en SQL Server 2005
-
02-07-2019 - |
Pregunta
Estoy intentando crear una UDF en SQL Server 2005 Express
como a continuación:
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
Las cocinas tienen la estructura:
CuisineID INT PK,
Cuisine VARCHAR(20)
Cuando intento crear la función como se indica arriba, aparece un error:
MSG 102, Nivel 15, Estado 1, Procedimiento CombineValues, línea 10 sintaxis incorrecta cerca de '='.
¿Qué estoy haciendo mal?
Solución
Esta respuesta es del cartel original, Wild Thing.Por favor, no votes a favor o en contra.
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
Otros consejos
Debe tener cuidado al utilizar este método.Es posible que esto no le afecte ahora para esta consulta, pero téngalo en cuenta para futuras aplicaciones de este método.
El problema ocurre cuando tienes un valor NULL en tu lista.Cuando esto suceda, obtendrá resultados incorrectos.
Por ejemplo, si su tabla original se ve así...
1 Blah
2 NULL
3 Foo
4 Cracker
Tu función devolverá Foo, Cracker.Esta llamada a función omitirá el primer valor, Blah.Es muy fácil acomodar esto, con una ligera alteración en su función, así...
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
Al probar NOT NULL, eliminará este problema potencial.
intente cambiar SELECT a SET y luego finalice su función SELECCIONANDO (ing) su @CuisineList
Hojou, tu sugerencia no funcionó, pero algo similar sí:
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
Me gustaría marcar esto como la respuesta, pero como fui yo quien hizo esta pregunta, no estoy seguro de que sea apropiado.¿Alguna sugerencia?Por favor, siéntase libre de comentar.