#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
при определении функции.