2008-11-19 4 views
2

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

Это работает с 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 

Но с оригинальным стилем, используя СЛУЧАЙ ... КОГДА ТО BLOCK я получаю сообщение об ошибке.

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.

ответ

4

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

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 
+0

мс должно быть @ms и код не будет работать в любом случае, потому что все переменные VARCHAR будут недобросовестный VARCHAR (1) – 2008-11-19 18:43:14

+0

Исправленная опечатка NXC с «мс». Спасибо, Кейд. – 2008-11-19 18:55:24

3

Я думаю, ваша проблема в том, что вы не указываете размер на вашем 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'. Я не уверен, почему вы не получаете предупреждение об усечении, когда это происходит, когда вы набираете SQLINSERT, но там вы идете.

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