Sql server 靠近'的语法不正确;文件结束。';期待对话,或尝试

Sql server 靠近'的语法不正确;文件结束。';期待对话,或尝试,sql-server,Sql Server,我对这个很陌生。我一直在搞一些T-SQL,现在我正在做一些基本的密码工作。现在,当我这样做的时候,正如你在代码中看到的,如果你使用了重复的用户名,我将它设置为尝试并抛出一个错误,如果它发现没有问题并创建了帐户,它会发送消息“User created”或类似的消息。这失败了,虽然主键确实阻止了重复用户名的插入,但它无论如何都会增加标识列,给我留下2个用户,一个用户ID为1,另一个用户ID为17。此外,它不会抛出一个错误,只是说命令已执行。所以,为了尝试强制出错,我对代码做了一些可能非常意大利式的修

我对这个很陌生。我一直在搞一些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