SQL-запрос работает хорошо, но не сделанная из него функция - PullRequest
0 голосов
/ 29 апреля 2018

Я пытаюсь создать функцию, которая возвращает продолжительность полета.

Он хорошо работает с простым запросом, но когда я пытаюсь использовать функцию, он возвращает 0 ...

Возвращает 1: 00

declare @FlightId int,
        @Departure datetime,
        @Arrival datetime,
        @duration varchar

set @FlightId = (select FlightId from Flight where FlightNumber = 'ZZZ')
set @Departure = (select min(Departure) from Step where FlightId = @FlightId )
set @Arrival = (select max(Arrival) from Step where FlightId = @FlightId )

select CONVERT(varchar(5), DATEADD(minute, DATEDIFF(minute, @Departure, @Arrival), 0), 114)

и это функция, которая возвращает 0

alter function FlightDuration
    (@FlightNumber varchar(50)) 
returns varchar
as 
begin
    declare @FlightId int,
            @Departure datetime,
            @Arrival datetime,
            @duration varchar

    set @FlightId = (select FlightId from Flight where FlightNumber = @FlightNumber)
    set @Departure = (select min(Departure) from Step where FlightId = @FlightId )
    set @Arrival = (select max(Arrival) from Step where FlightId = @FlightId )

    set @duration = CONVERT(varchar(12), DATEADD(minute, DATEDIFF(minute, @Departure, @Arrival), 0), 114)

    return @duration
end

Я называю это так:

SELECT dbo.FlightDuration ('ZZZ')

Ответы [ 2 ]

0 голосов
/ 29 апреля 2018

Полагаю, что рейса 'ZZZ' не существует. В первом случае @FlightId мог быть установлен предыдущим запросом. Чтобы проверить успешность запроса, сделайте что-то вроде этого:

SET @FlightId = NULL;
SELECT @FlightId = FlightId FROM Flight WHERE ...
IF @FlightId IS NULL
  SET @duration = 'N/A'
ELSE BEGIN
  SELECT @Departure = min(Departure), @Arrival = max(Arrival) FROM Step WHERE FlightId = @FlightId;
  SET @duration = CONVERT...
END
0 голосов
/ 29 апреля 2018

Возможно, проблема в атрибуте длины в varchar. Без длины SQL Server по умолчанию имеет длину «1».

Итак, попробуйте объявить функцию как:

alter function FlightDuration (
    @FlightNumber varchar(50)
) returns varchar(12)
begin
    . . .
end;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...