EREQUEST неправильный синтаксис рядом с ‘END’

#sql #sql-server #user-defined-functions

#sql #sql-сервер #определяемые пользователем функции

Вопрос:

Я создал простую функцию SQL Server. Как только я добавил IF Else блок, он начал показывать ошибку:

EREQUEST неправильный синтаксис рядом с ‘END’

Хотя код кажется простым и я также просмотрел несколько сообщений на форуме, я не могу понять, в чем именно проблема. Пожалуйста, помогите.

 CREATE FUNCTION Detect_Subscription(@ID INT) RETURNS VARCHAR(20)
BEGIN
DECLARE @Status INT, @customer VARCHAR(20);
SELECT @Status = COUNT(*) FROM premium WHERE premium.user_id = @ID;
IF @Status > 0 THEN SET @customer = 'Premium';
ELSE SET @customer = 'Free';    
END IF;
RETURN @customer;   
END
  

Комментарии:

1. Вы уверены, что написали свою функцию для MySQL? Кажется, Sql Server

2. Спасибо за помощь, Джо! 🙂 Да, вы правы, я их перепутал. момент facepalm

3. END IF В T-SQL нет. Это либо IF {boolean statement} {true statement} ELSE {False Statement} или IF {boolean statement} BEGIN {True statements} END ELSE BEGIN {False statements} END

4. Изучите хорошие привычки. Нет причин фактически ПОДСЧИТЫВАТЬ строки для проверки существования — и это менее эффективно.

5. @Larnu Спасибо за помощь 🙂

Ответ №1:

Ваша функция кажется подходящей для SQL Server.

Вы можете упростить свою функцию следующим образом:

 CREATE FUNCTION Detect_Subscription(@ID INT) RETURNS VARCHAR(20)
BEGIN
    DECLARE @customer VARCHAR(20);

    SELECT
        @Customer =
        CASE
            WHEN COUNT(1) > 0 THEN 'Premium'
            ELSE 'Free'
        END
    FROM premium WHERE premium.user_id = @ID;

    RETURN @customer;   
END
  

Ответ №2:

Я думаю, что использование IF в порядке. Я бы просто связал его с EXISTS :

 CREATE FUNCTION Detect_Subscription (
    @ID INT
) RETURNS VARCHAR(20) AS
BEGIN
    DECLARE @customer VARCHAR(20);

    IF (EXISTS (SELECT 1 FROM premium p WHERE p.user_id = @ID))
    BEGIN
        SET @customer = 'Premium';
    END;
    ELSE SET @customer = 'Free';    

    RETURN @customer;   
END;
  

Это немного быстрее, чем COUNT(*) если бы у вас было несколько строк premium для данного пользователя (и нано-незначительно быстрее, если это невозможно).

Важные моменты:

  • SQL Server не имеет END IF .
  • SQL Server требует AS при определении функции.