Sql server 靠近'的语法不正确;文件结束。';期待对话,或尝试
我对这个很陌生。我一直在搞一些T-SQL,现在我正在做一些基本的密码工作。现在,当我这样做的时候,正如你在代码中看到的,如果你使用了重复的用户名,我将它设置为尝试并抛出一个错误,如果它发现没有问题并创建了帐户,它会发送消息“User created”或类似的消息。这失败了,虽然主键确实阻止了重复用户名的插入,但它无论如何都会增加标识列,给我留下2个用户,一个用户ID为1,另一个用户ID为17。此外,它不会抛出一个错误,只是说命令已执行。所以,为了尝试强制出错,我对代码做了一些可能非常意大利式的修改,现在它在最后给了我一个不正确的语法错误 确切的错误如标题所示,“文件结尾附近的语法不正确。需要对话,或者重试。”我不知道为什么。我四处搜索了一下,似乎找不到其他有这个错误的人,也不明白为什么会出现这两种情况,所以我迷路了。沐浴在我的意大利面准则的荣耀中;如果您可以想出一种方法来解决不从存储过程抛出错误这一初始问题,而不是解决不正确的语法错误,那也将是受欢迎的Sql server 靠近'的语法不正确;文件结束。';期待对话,或尝试,sql-server,Sql Server,我对这个很陌生。我一直在搞一些T-SQL,现在我正在做一些基本的密码工作。现在,当我这样做的时候,正如你在代码中看到的,如果你使用了重复的用户名,我将它设置为尝试并抛出一个错误,如果它发现没有问题并创建了帐户,它会发送消息“User created”或类似的消息。这失败了,虽然主键确实阻止了重复用户名的插入,但它无论如何都会增加标识列,给我留下2个用户,一个用户ID为1,另一个用户ID为17。此外,它不会抛出一个错误,只是说命令已执行。所以,为了尝试强制出错,我对代码做了一些可能非常意大利式的修
ALTER procedure [dbo].[adduser]
@pUsername nvarchar(50),
@pPassword nvarchar(50),
@responsemessage nvarchar(250) output,
@saveme nvarchar(30) = 'Duplicate username'
as
set nocount on
begin
declare @salt UNIQUEIDENTIFIER=newid()
begin tran
begin try
if exists ((select Username from UserLogins where Username = @pUsername))
begin
rollback tran
raiserror(1337, 16, @saveme)
end
else
begin try
insert into dbo.UserLogins (Username, PasswordHash, Salt)
values(@pUsername, hashbytes('SHA2_512', @pPassword+cast(@salt as nvarchar(36))), @salt)
set @responsemessage='User created'
end try
begin catch
set @responsemessage = ERROR_MESSAGE()
end catch
end
缩进应该给你一个提示。开始时有一个
begin try
,但任何地方都没有匹配的end try
。如果您要执行开始传输
,那么提交
在哪里?看起来你复制粘贴了一些东西,但缺少了一整块。你是对的,因为某些原因,“结束尝试”没有复制。但是你说得对,我错过了一个“提交”的小解释,关于错误是什么以及如何解决它将是非常棒的。
alter procedure [dbo].[adduser]
@pUsername nvarchar(50),
@pPassword nvarchar(50),
@responsemessage nvarchar(250) output
as
begin
set nocount on
begin try
declare @salt UNIQUEIDENTIFIER=newid()
declare @saveme nvarchar(20) = 'Duplicate username'
begin tran t1
if exists ((select Username from UserLogins where Username = @pUsername))
begin
raiserror(@saveme,16, 1)
end
else
begin
insert into UserLogins (Username, Password, Salt)
values(@pUsername, hashbytes('SHA2_512', @pPassword+cast(@salt as nvarchar(36))), @salt)
set @responsemessage='User created'
end
commit tran t1
end try
begin catch
set @responsemessage = ERROR_MESSAGE()
rollback tran t1
end catch
end