Вопрос

Я пытаюсь создать 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

Я хотел бы отметить это как ответ, но поскольку я тот, кто задал этот вопрос, я не уверен, что это уместно?Есть какие-нибудь предложения?Пожалуйста, не стесняйтесь комментировать.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top