Domanda

Sto cercando di creare un UDF in SQL Server 2005 Express come di seguito:

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

La cucina ha la struttura:

CuisineID INT PK,
Cuisine VARCHAR(20)

Quando provo a creare la funzione come sopra, ricevo un errore:

  

Messaggio 102, livello 15, stato 1, procedura CombineValues, riga 10 errata   sintassi vicino '='.

Cosa sto sbagliando?

È stato utile?

Soluzione

Questa risposta è tratta dal poster originale, Wild Thing. Si prega di non votare su o giù.

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

Altri suggerimenti

Devi fare attenzione quando usi questo metodo. Questo potrebbe non interessarti ora, per questa query, ma tienilo a mente per future applicazioni di questo metodo.

Il problema si verifica quando si dispone di un valore NULL nell'elenco. Quando ciò accade, otterrai risultati errati.

Ad esempio, se la tabella originale è simile a questa ...

1   Blah
2   NULL
3   Foo
4   Cracker

La tua funzione restituirà Foo, Cracker. Il primo valore, Blah, verrà perso da questa chiamata di funzione. È molto facile adattarlo, con una leggera alterazione della tua funzione, come questa ...

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

Testando NOT NULL, eliminerai questo potenziale problema.

prova a cambiare SELEZIONA su SET e poi termina la tua funzione SELEZIONA (ing) il tuo @CuisineList

Hojou, il tuo suggerimento non ha funzionato, ma qualcosa di simile ha funzionato:

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

Vorrei contrassegnare questa come risposta, ma poiché sono io che ho posto questa domanda, non sono sicuro che sia appropriato? Eventuali suggerimenti? Non esitate a commentare.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top