xhon Ответов: 1

Создайте скалярную функцию для возврата INT или 0


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

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

Что я уже пробовал:

CREATE FUNCTION Movies.ReturnNumberOfCopies(@IDMovies INT)
RETURNS INT
AS
BEGIN
   DECLARE @NumberOfCopiesIfMovieExists INT;
   --DECLARE @IDMovies INT;

   SELECT @NumberOfCopiesIfMovieExists = Movis.NumberOfCopies
   FROM Movies
   --WHERE Movies.IDMovies IS NOT NULL
   
   RETURN @NumberOfCopiesIfMovieExists 
END


чтобы вызвать функцию и распечатать вывод я передал 3 Как IDMovie но количество копий не совпадает с ожидаемым
SELECT Movies.ReturnNumberOfCopies(3)   -- 

1 Ответов

Рейтинг:
4

Richard Deeming

CREATE FUNCTION Movies.ReturnNumberOfCopies(@IDMovies INT)
RETURNS INT
AS
BEGIN
   DECLARE @NumberOfCopiesIfMovieExists INT;

   SELECT @NumberOfCopiesIfMovieExists = Movis.NumberOfCopies
   FROM Movies
   WHERE Movies.IDMovies = @IDMovies;
   
   RETURN IsNull(@NumberOfCopiesIfMovieExists, 0);
END
Имейте в виду, что производительность определяемых пользователем функций с несколькими операторами невелика.


Richard Deeming

Вы пытаетесь создать функцию в схеме, имя которой не существует. И если он действительно существует, он конфликтует с именем вашей таблицы, что может вызвать проблемы.

Создайте свою функцию в той же схеме, что и ваша таблица:

CREATE FUNCTION dbo.ReturnNumberOfCopies(@IDMovies INT) ...

xhon

У меня есть пара сомнений: когда вы писали :
RETURN IsNull((@NumberOfCopiesIfMovieExists, 0)

это все равно что сказать :"возвращайте значения по умолчанию и возвращайте 0, если NumberOfCopies равно 0", верно?

А что, если я захочу назначить псевдоним выходному столбцу?

Richard Deeming

ISNULL (Transact-SQL) - SQL Server | Microsoft Docs[^]
Если @NumberOfCopiesIfMovieExists не является NULL, это значение будет возвращено. В противном случае функция вернет 0.

Нет "выходной столбец" псевдоним в скалярной пользовательской функции.

xhon

Большое спасибо! Мне было интересно, почему мы должны использовать переменные для установки возвращаемого значения вместо того, чтобы писать имя столбца: если я подставляю параметр @NumberOfCopis следующим образом: 'return Movie.NumberOfCopies' мне говорят, что многосоставный идентификатор 'Movie.NumberoOfCopies' не может быть привязан, что это значит и почему так важно использовать параметры в sql-функции? Это зависит от необходимости отслеживать данные объекта, чтобы иметь возможность выводить их значение, не так ли?

Richard Deeming

Вы не можете ссылаться на имя столбца за пределами SELECT или UPDATE заявление. Return SomeTableName.SomeColumnName недопустимый синтаксис SQL.