Ошибка создания UDF в SQL Server 2005 - PullRequest
0 голосов
/ 21 сентября 2008

Я пытаюсь создать 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 неверна синтаксис рядом с '='.

Что я делаю не так?

Ответы [ 4 ]

1 голос
/ 22 сентября 2008

Вы должны быть осторожны при использовании этого метода. Это может не повлиять на вас сейчас, для этого запроса, но имейте это в виду для будущих применений этого метода.

Проблема возникает, когда в вашем списке есть значение NULL. Когда это произойдет, вы получите неправильные результаты.

Например, если ваша исходная таблица выглядит следующим образом ...

1   Blah
2   NULL
3   Foo
4   Cracker

Ваша функция вернет Foo, Cracker. Первое значение, Blah, будет пропущено этим вызовом функции. Это очень легко приспособить, с небольшим изменением вашей функции, как это ...

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, вы устраните эту потенциальную проблему.

0 голосов
/ 21 сентября 2008

Ходзё, ваше предложение не сработало, но что-то похожее сработало:

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

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

0 голосов
/ 21 сентября 2008

Этот ответ от оригинального плаката Wild Thing. Пожалуйста, не голосуйте "за" или "против".

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
0 голосов
/ 21 сентября 2008

попробуйте изменить SELECT на SET, а затем завершите свою функцию, выбрав (ing) ваш @ CuisineList

...