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

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 に答える
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 CATCHC# で like を使用して例外を処理します- 値を常にチェックする必要はありません@@ERROR....

  • 基本的には、ユーザーの存在を確認するだけです -@Logそれに応じてメッセージを設定してください。ユーザーが存在しない場合は、挿入して@Logメッセージを「成功」に設定します

  • ラベル、GOTO、その他そのようなものは必要ありません....

于 2012-12-13T06:23:59.603 に答える