T SQL嵌套IF ... ELSE in BEGIN ... END

时间:2017-05-01 04:35:04

标签: sql-server sql-server-2008 tsql sql-server-2012

我想就这个程序存在问题的原因提供一些指导。我似乎收到一个错误,指出"关键字' END'附近的语法不正确。"

我认为问题在哪里添加了评论。在代码注释中标记为(x)和(y)。我使用DataGrip进行语法突出显示,以及我如何知道这些配对存在。但我仍然不明白为什么。

我知道CASE声明可以解决这个问题。但我想知道为什么它不能与IF...ELSE

一起使用
CREATE PROCEDURE AuthenticateUser(
  @UserName NVARCHAR(50),
  @Password NVARCHAR(50),
  @Result INT OUTPUT
) AS
  BEGIN -- Cannot find a corresponding END
    SET NOCOUNT ON

    DECLARE @userID INT

    IF exists(SELECT UserID FROM Users WHERE UserName = @UserName)
      BEGIN -- paired with END (y)
        SET @userID = (SELECT UserID FROM Users WHERE UserName = @UserName AND Password = dbo.EncryptPassword(@Password, Salt))

        IF @userID IS NULL -- Paired with END (x)
          SET @Result = 0
        ELSE
          SET @Result = 1

      END -- paired with IF (x)
    ELSE
      SET @Result = 0

  END -- paired with BEGIN (y)
GO

2 个答案:

答案 0 :(得分:1)

如何尝试在每个IF ELSE条件下添加BEGIN和END标签。这样的事情。

   CREATE PROCEDURE AuthenticateUser
            (
              @UserName NVARCHAR(50) ,
              @Password NVARCHAR(50) ,
              @Result INT OUTPUT
            )
        AS
            BEGIN -- Cannot find a corresponding END
                SET NOCOUNT ON

                DECLARE @userID INT

                IF EXISTS ( SELECT  1
                            FROM    Users
                            WHERE   UserName = @UserName )
                    BEGIN -- paired with END (y)
                        SET @userID = ( SELECT  UserID
                                        FROM    Users
                                        WHERE   UserName = @UserName
                                                AND Password = dbo.EncryptPassword(@Password,
                                                          Salt)
                                      )
                        IF @userID IS NULL -- Paired with END (x)
                            BEGIN
                                SET @Result = 0
                            END
                        ELSE
                            BEGIN
                                SET @Result = 1
                            END
                    END -- paired with IF (x)
                ELSE
                    BEGIN
                        SET @Result = 0
                    END 
            END -- paired with BEGIN (y)
        GO

答案 1 :(得分:0)

@Edwinj

If else阻止没有错,代码中存在问题

(密码= dbo.EncryptPassword(@ Password,)))

Salt 既不是数字也不是真实的或字符串,所以函数EncryptPassword将失败并显示错误。