В этой функции sql я получил несколько ошибок на сервере sql - PullRequest
0 голосов
/ 19 июня 2020

Я хочу вернуть, если в моей таблице есть запись, затем вернуть ее, а если в этой таблице нет записи, вернуть 'America / Chica go'.

Ошибка: Msg 102, уровень 15, состояние 1, процедура ufn_GetGCMoodleTimeZone, строка 18 [Batch Start Line 7] Неправильный синтаксис рядом с '@MoodleTimeZone'. Msg 102, уровень 15, состояние 1, процедура ufn_GetGCMoodleTimeZone, строка 22 [Batch Start Line 7] Неправильный синтаксис рядом с 'END'.

ALTER FUNCTION [dbo].[ufn_GetGCMoodleTimeZone]
 ( @HSATimeZone VARCHAR(250) )RETURNS varchar(250)
AS
  BEGIN
    DECLARE @MoodleTimeZone varchar(250) 
    SELECT @MoodleTimeZone = GCMoodleTimeZoneMap.MoodleTimeZone
    FROM GCMoodleTimeZoneMap
    WHERE GCMoodleTimeZoneMap.HSATimeZone = @HSATimeZone
    IF @MoodleTimeZone='NULL'
    BEGIN
            @MoodleTimeZone='America/Chicago'
    END 
    RETURN @MoodleTimeZone

  END

1 Ответ

1 голос
/ 19 июня 2020

Комментарий об использовании SET и о том, как проверить на NULL, верен, поэтому я не буду повторять это. Тем не менее, то, что вы хотите, можно записать короче и эффективнее следующим образом:

ALTER FUNCTION [dbo].[ufn_GetGCMoodleTimeZone]
 ( @HSATimeZone VARCHAR(250) )RETURNS varchar(250)
AS
BEGIN
  RETURN ISNULL(
      (SELECT TOP 1 MoodleTimeZone
       FROM   GCMoodleTimeZoneMap
       WHERE  HSATimeZone = @HSATimeZone
      ), 'America/Chicago'
    )
END

Объяснение:

  1. Внутренний SELECT вернет либо одну строку, либо ни одной строки.
  2. ISNULL() обработает этот результат и в случае «без строк» ​​заменит значение по умолчанию 'America/Chicago'.

Вот рабочий скрипт БД:
https://dbfiddle.uk/?rdbms=sqlserver_2019&fiddle=f4c9e946475818e538ed8f63160d6971

...