Ошибка при создании UDF в SQL Server 2005
-
02-07-2019 - |
Вопрос
Я пытаюсь создать UDF в SQL Server 2005 Express
как показано ниже:
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
Кухня имеет следующую структуру:
CuisineID INT PK,
Cuisine VARCHAR(20)
Когда я пытаюсь создать функцию, как описано выше, я получаю сообщение об ошибке:
Сообщение 102, Уровень 15, состояние 1, Процедура комбинирует значения, строка 10 неправильная синтаксис рядом с '='.
Что я делаю не так?
Решение
Этот ответ взят с оригинального плаката "Дикая штука".Пожалуйста, не голосуйте за или против.
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
Другие советы
Вам нужно быть осторожным при использовании этого метода.Возможно, это не повлияет на вас сейчас, при выполнении данного запроса, но, пожалуйста, имейте это в виду при будущих применениях этого метода.
Проблема возникает, когда у вас в списке есть НУЛЕВОЕ значение.Когда это произойдет, вы получите неверные результаты.
Например, если ваша исходная таблица выглядит следующим образом...
1 Blah
2 NULL
3 Foo
4 Cracker
Ваша функция вернет Foo, Cracker .Первое значение, Бла-бла, будет пропущено при вызове этой функции.Это очень легко приспособить, слегка изменив вашу функцию, вот так...
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
Проверив наличие NOT NULL, вы устраните эту потенциальную проблему.
попробуйте изменить "ВЫБРАТЬ" на "УСТАНОВИТЬ", а затем завершите работу, ВЫБРАВ свой @CuisineList
Ходзе, твое предложение не сработало, но что-то подобное сработало:
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
Я хотел бы отметить это как ответ, но поскольку я тот, кто задал этот вопрос, я не уверен, что это уместно?Есть какие-нибудь предложения?Пожалуйста, не стесняйтесь комментировать.