【问题标题】:In this sql functionI i got some errors in sql server在这个 sql 函数中,我在 sql server 中遇到了一些错误
【发布时间】:2020-06-19 08:21:33
【问题描述】:

如果我的表中有记录,我想返回,然后返回,如果该表没有记录,则返回 'America/Chicago'。

错误:消息 102,级别 15,状态 1,过程 ufn_GetGCMoodleTimeZone, 第 18 行 [第 7 行批处理开始] '@MoodleTimeZone' 附近的语法不正确。 消息 102,级别 15,状态 1,过程 ufn_GetGCMoodleTimeZone,第 22 行 [批处理开始第 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

【问题讨论】:

  • @MoodleTimeZone='America/Chicago' --> SET @MoodleTimeZone='America/Chicago'。此外,@MoodleTimeZone='NULL' 应该是 @MoodleTimeZone IS NULL'。您可以轻松地将其重写为表值函数以提高性能(和可读性)。

标签: sql sql-server date sql-function


【解决方案1】:

关于使用 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'

这是一个有效的 DB Fiddle:
https://dbfiddle.uk/?rdbms=sqlserver_2019&fiddle=f4c9e946475818e538ed8f63160d6971

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-05
    • 2021-07-03
    • 2021-11-24
    相关资源
    最近更新 更多