Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server T SQL嵌套在BEGIN…END中的IF…ELSE_Sql Server_Sql Server 2008_Tsql_Sql Server 2012 - Fatal编程技术网

Sql server T SQL嵌套在BEGIN…END中的IF…ELSE

Sql server T SQL嵌套在BEGIN…END中的IF…ELSE,sql-server,sql-server-2008,tsql,sql-server-2012,Sql Server,Sql Server 2008,Tsql,Sql Server 2012,我想了解一下为什么这个程序会有问题。我似乎得到了一个错误,说明“关键字‘END’附近的语法不正确。” 我在我认为存在问题的地方添加了评论。在代码内注释中标记为(x)和(y)。我使用DataGrip进行语法高亮显示,这就是我知道这些配对存在的原因。但我还是不明白为什么 我知道一个案例声明可以解决这个问题。但是我想知道为什么它不能与IF…ELSE一起工作 CREATE PROCEDURE AuthenticateUser( @UserName NVARCHAR(50), @Password

我想了解一下为什么这个程序会有问题。我似乎得到了一个错误,说明“关键字‘END’附近的语法不正确。”

我在我认为存在问题的地方添加了评论。在代码内注释中标记为(x)和(y)。我使用DataGrip进行语法高亮显示,这就是我知道这些配对存在的原因。但我还是不明白为什么

我知道一个
案例
声明可以解决这个问题。但是我想知道为什么它不能与
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
@埃德温

If-else块中没有错误,代码中存在问题

Salt(Password=dbo.EncryptPassword(@Password,Salt))


Salt既不是数字也不是字符串,因此函数EncryptPassword将失败并出错。

如何尝试在每个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  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

无法使用SSMS 2016或SSMS 2012复制SQL Server 2012中的问题。你用的是什么版本?查询中是否有其他代码?是否从SSMS以外的其他地方运行此代码?Go不是一个SQL命令,而是SSMSHey中的一个分隔符。您的过程运行良好。我在SQL Server 2014上尝试了这个方法。这可能是真正的问题,但我使用的是SQL Server for Linux。(因此我使用的是Datagrip而不是SSMS)@Edwinj您如何在Linux上运行2008/2012?我认为这是从2016年开始才被支持的代码在这一点上并没有实际运行,它只是一个存储过程定义,所以加密密码所传递的内容应该没有任何区别它不是一个合法变量,也不是int不是合法字符串。你怎么知道它不是
users
表中的一列呢?你调用的函数EncryptPassword signature used告诉我们需要2个parm秒,parm is Salt既不是真的也不是int,或者字符串…如果没有EncryptPassword(它不是我的SQL 2012副本上的内置函数)和
Users
表的定义,您就不可能知道他是否正确使用了它。很明显,它不是变量、整型文字或字符串文字。我怀疑
Salt
Users
表中的一列,因此它的调用方式如下:
Select。。。从用户那里。。。和Password=dbo.EncryptPassword(@Password,Users.Salt)
谢谢@von,但不幸的是这对我不起作用。