如果SQL Server函数中的else语句将无法编译

问题描述 投票:0回答:4

我想查看一个日期是否发生在去年,如果是,那么将值增加1.所以我尝试了以下,但它返回以下错误:

消息102,级别15,状态1,过程完成,第41行[批次启动第7行] '@compliant'附近的语法不正确。

码:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER FUNCTION [dbo].[IsComplete] (@input VARCHAR(9))
RETURNS CHAR(1)
AS 
BEGIN
    DECLARE @idnum VARCHAR(9)
    DECLARE @complete CHAR
    DECLARE @cert int
    DECLARE @compliant int

    SET @idnum = SUBSTRING(@input, 0, 9)
    SET @compliant = 0

    SET @cert = (SELECT DATEDIFF(month, CertifiedDate, GETDATE()) 
                 FROM Profile 
                 WHERE IDNumber = @idnum)

    BEGIN
        IF @cert > 11
        BEGIN
            @compliant = @compliant + 1
        END
        ELSE
        BEGIN
            -- do nothing
        END
    END 

    RETURN @complete
END

看起来很简单,但我无法让它工作,因为它会产生错误并且不会编译。有人能指出我正确的方向吗?

sql-server tsql
4个回答
1
投票

根据错误,在函数的第25行,你只是忘了添加SET。所以改变如下:

SET @compliant = @compliant + 1

3
投票

应用KISS principle

SET @compliant = @compliant + 
    (SELECT
      case when DATEDIFF(month, CertifiedDate, GETDATE()) > 11 then 1 else 0 end
     FROM Profile
     WHERE IDNumber = @idnum)

0
投票

这是因为你的Else子句是空的,而SQL不喜欢空子句。

只需删除整个'Else'部分(因为它什么都不做),你的查询应该编译:)


0
投票

请尝试以下查询:

USE [CDB]
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER FUNCTION [dbo].[IsComplete] (@input VARCHAR(9))
RETURNS CHAR(1)

AS BEGIN
DECLARE @idnum VARCHAR(9)
DECLARE @complete CHAR
DECLARE @cert int
DECLARE @compliant int

SET @idnum = SUBSTRING(@input, 0, 9)
SET @compliant = 0

SET @cert = (SELECT DATEDIFF(month, CertifiedDate, GETDATE()) FROM Profile WHERE IDNumber = @idnum)

BEGIN
    IF @cert > 11
        BEGIN
            SET @compliant = @compliant + 1
        END
    --ELSE
    --    BEGIN
    --        -- do nothing
    --    END
END 

RETURN @complete

END

说明:

  • 我的查询只做了两处小改动: 将SET添加到@compliant = @compliant + 1行 评论不需要的ELSE块。
  • 如果需要,您显然可以在以后简化逻辑。但是,最好先修复错误。

看看它是否有效。

© www.soinside.com 2019 - 2024. All rights reserved.