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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top