2

我是 SQL 新手,也是我第一次创建存储过程。

我应该插入数据并得到一个返回字符串。返回值应该被成功插入,或者如果失败,如果用户名已经存在,应该通知我..或者类似的东西

我被困在错误代码中:

所以这是我的代码..

Create Proc Mock_InsertUser 
(
@Username varchar(20),
@Password varchar(100), 
@fullName varchar(60),
@Activated bit, 
@Suspended bit 
)
as
Begin
  DECLARE 
    @Error INT,
    @rowcount INT,
    @log varchar(1000)

IF EXISTS(SELECT username FROM Users_mock WHERE username = @Username)
BEGIN
    SET @log = 'Username ' + @Username + ' already exists.'
    GOTO ERROR  
END

Insert into Users_mock 
  (username, [password], full_name, Activated, Suspended)
values 
  (@Username, @Password, @fullName, @Activated, @Suspended)

SELECT @Error = @@ERROR, @rowcount = @@ROWCOUNT

--if there is an error OR If row is not inserted..
IF @Error <> 0 OR @rowcount < 1
BEGIN
   SET @log = 'Failed to Insert Account.'
   GOTO ERROR
END

-----------------------------------------------------------
Error:

--Some code here
END

对不起,糟糕的问题:)

4

2 回答 2

1

你为什么不使用这样的东西:

CREATE PROCEDURE dbo.Mock_InsertUser
       (@Username VARCHAR(20),
        @Password VARCHAR(100),
        @fullName VARCHAR(60),
        @Activated BIT,
        @Suspended BIT )
AS 
BEGIN
    BEGIN TRY
       DECLARE @Error INT, @rowcount INT, @log VARCHAR(1000)

       -- check if user exists    
       IF EXISTS (SELECT * FROM dbo.Users_mock WHERE username = @Username) 
       BEGIN
          -- yes - just define the response message
          SET @log = 'Username ' + @Username + ' already exists.'
       END
       ELSE BEGIN      
          -- doesn't exist - insert data
          INSERT INTO 
              dbo.Users_mock(username, [password], full_name, Activated, Suspended)
          VALUES
              (@Username, @Password, @fullName, @Activated, @Suspended)

          -- set response message
          SET @log = 'Username ' + @Username + ' successfully inserted.'
       END
    END TRY
    BEGIN CATCH
       -- handle exceptions - you can access error details here, too, if you need to
       SET @log = 'Some really weird error happened.'
    END CATCH  

    -- return the message back to the caller    
    SELECT @Log
END

看点:

  • BEGIN TRY/END TRY - BEGIN CATCH/END CATCH在 C# 中使用like 来处理异常- 无需不断检查@@ERROR值....

  • 基本上只是检查用户的存在 -@Log相应地设置消息。如果用户不存在,将其插入并将@Log消息设置为“成功”

  • 不需要标签,GOTO 和其他类似的东西....

于 2012-12-13T06:23:59.603 回答
1

使用 ELSE 关键字:

IF EXISTS(SELECT username FROM Users_mock WHERE username = @Username)
BEGIN
    SET @log = 'Username ' + @Username + ' already exists.'
    SELECT @log --this end the stored procedure. it is like the return keyword.
END
ELSE
BEGIN
    Insert into Users_mock 
    (username, [password], full_name, Activated, Suspended)
    values 
    (@Username, @Password, @fullName, @Activated, @Suspended)

    DECLARE @Error = @@ERROR 
    DECLARE @rowcount = @@ROWCOUNT 

    --if there is an error OR If row is not inserted..
    IF @Error <> 0 OR @rowcount < 1
    BEGIN
        SET @log = 'Failed to Insert Account.'
        SELECT @log
    END
END
于 2012-12-13T06:25:29.220 回答