Errore durante la creazione di UDF in SQL Server 2005
-
02-07-2019 - |
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?
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.