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