Sql Server Case Statement дает мне ошибки в пользовательской функции - PullRequest
2 голосов
/ 19 ноября 2008

Я хочу использовать оператор case в моих пользовательских функциях, потому что мне нужно сопоставить несколько терминов. Я мог бы использовать таблицу для совпадений, но тогда я не смог бы поместить ее в определение вычисляемого столбца.

Это работает с операторами IF:

CREATE FUNCTION MaraSizeNumber
(
    @ms varchar
)
RETURNS varchar
AS
BEGIN
    IF ms = '16-18' RETURN '1'
    ELSE IF ms = '18-20' RETURN '2'
    ELSE IF ms = '20-22' RETURN '3'
    ELSE IF ms = '22+' RETURN '4'
    ELSE IF ms = '24+' RETURN '5'
    ELSE IF ms = '14-16' RETURN '7'
    ELSE RETURN 'BAD'
END

Но в оригинальном стиле с использованием CASE ... КОГДА БЛОК я получаю сообщение об ошибке.

CREATE FUNCTION MaraSizeCaseExample
(
    @ms varchar
)
RETURNS varchar
AS
BEGIN
    CASE ms
        WHEN '16-18' THEN RETURN '1'
        WHEN '18-20' THEN RETURN '2'
        WHEN '20-22' THEN RETURN '3'
        WHEN '22+' THEN RETURN '4'
        WHEN '24+' THEN RETURN '5'
        WHEN '14-16' THEN RETURN '7'
        ELSE RETURN 'BAD'
    END
END 

Я получаю сообщение об ошибке "Неверный синтаксис рядом с регистром" и неправильный синтаксис "когда", когда мои части когда.

Я правильно сгруппировал все, потому что мой последний блок CREATE FUNCTION заканчивается GO, и в соответствии с документацией по CASE у меня правильный синтаксис.

У меня есть большая скалярная функция, которую я создаю, которая будет использовать другие скалярные функции для генерации производственного кода в нашей системе, соответствующего другим параметрам. Лучше всего использовать CASE, потому что производственное кодирование зависит от продукта и клиента.

Я также получаю дополнительную ошибку во втором примере в строке «Создать функцию», которая гласит: «Неверный синтаксис:« Создать функцию »должен быть единственным оператором в пакете», но со всем остальным идентичным я не получаю это » ошибка с IF.

Что я делаю не так, или CASES допускается только в SQL-запросах, а не в скалярных функциях? Сообщения об ошибках поступают из системы сообщений об ошибках в SQL Server Management Studio.

Ответы [ 2 ]

4 голосов
/ 19 ноября 2008

Оператор case должен выглядеть следующим образом:

RETURN CASE @ms
       WHEN '16-18' THEN '1'
       WHEN '18-20' THEN '2'
       WHEN '20-22' THEN '3'
       WHEN '22+' THEN '4'
       WHEN '24+' THEN '5'
       WHEN '14-16' THEN '7'
       ELSE 'BAD'
  END
3 голосов
/ 19 ноября 2008

Я думаю, что ваша проблема в том, что вы не указываете размер вашего varchar (по умолчанию 1). Это приводит к тому, что ввод и вывод усекаются до одного символа. (Вы также пропустили @ в вашей переменной внутри функции.)

Таким образом, PRINT dbo.SizeExample('16-18') напечатает 'B' (который не только усечен, но и не тот ответ, который вам, вероятно, нужен, который '1')

Попробуйте вместо:

CREATE FUNCTION MaraSizeExample
(
    @ms varchar(5)
)
RETURNS varchar(3)
AS
BEGIN
    RETURN CASE @ms
        WHEN '16-18' THEN '1'
        WHEN '18-20' THEN '2'
        WHEN '20-22' THEN '3'
        WHEN '22+' THEN '4'
        WHEN '24+' THEN '5'
        WHEN '14-16' THEN '7'
        ELSE 'BAD'
    END
END
  1. CASE - это просто искомое (или ищущее) выражение - вы не можете RETURN изнутри него - это похоже на IIF() в VB или IF() в Excel. Предыдущий ответ в основном объяснял это.

  2. VARCHAR означает VARCHAR(1), поэтому вы получите усечение - то есть вы никогда не увидите, как выходит 'BAD', только 'B'. Я не уверен, почему вы не получаете предупреждение об усечении, когда это происходит, как будто вы набираете SQL INSERT, но вы идете.

  3. @ms - имя вашей переменной. Я не уверен, почему ms был бы принят, если бы не было какого-либо другого объекта базы данных с таким именем (таблица?) - и даже тогда это не будет. Все переменные и параметры в T-SQL имеют префикс @ следующим образом.

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