Как проверить, успешно ли выполнена операция удаления / обновления, используя хранимую процедуру? - PullRequest
2 голосов
/ 19 января 2010

Скажем, у нас есть хранимая процедура (ы), выполняющая простые операции

CREATE PROCEDURE [dbo].[AddNewAuthorReturnID]
(   
    @Author_Name VARCHAR(MAX),
    @Author_ID int OUTPUT
)
AS
    SET NOCOUNT OFF;
BEGIN
 INSERT INTO AUTHORS (@Author_Name)
 VALUES (@Author_Name)
 SET @Author_ID = SCOPE_IDENTITY()
 SELECT @Author_ID
END

В вышеописанной процедуре перенастроенный идентификатор является показателем успешной операции.

Учтите это

CREATE PROCEDURE [dbo].[DeleteAuthor]
(       
    @Author_ID int 
)
AS
    SET NOCOUNT OFF;
BEGIN
 DELETE FROM AUTHORS 
 WHERE
 (Author_ID = @Author_ID)
END
  • Как мы можем знать, что операция была успешный и запись (автор) была удаляется, если мы используем выше процедура ?

  • То же самое с операцией обновления?

спасибо

Ответы [ 3 ]

3 голосов
/ 19 января 2010

Вы можете вернуть @@ROWCOUNT, чтобы определить, повлияло ли ваше последнее утверждение на какую-либо запись.

2 голосов
/ 19 января 2010

Вы можете вернуть значение из хранимой процедуры с помощью оператора return.Переменная @@ERROR равна нулю, если ошибки не было.

@@ ERROR

CREATE PROCEDURE [dbo].[DeleteAuthor]
(       
    @Author_ID int 
)
AS
    SET NOCOUNT OFF;
BEGIN
 DELETE FROM AUTHORS 
 WHERE
 (Author_ID = @Author_ID)

 Return @@ERROR

END
2 голосов
/ 19 января 2010

Вы можете выбрать @@ rowcount

Он покажет вам затронутые строки.

* 1005 например *

CREATE PROCEDURE [dbo].[DeleteAuthor]
(       
    @Author_ID int 
)
AS
    SET NOCOUNT OFF;
BEGIN
 DELETE FROM AUTHORS 
 WHERE
 (Author_ID = @Author_ID)
 SELECT @@ROWCOUNT 
END

Это также можно применить для обновления.

CREATE PROCEDURE [dbo].[UpdateAuthor]
(       
    @Author_ID int 
)
AS
    SET NOCOUNT OFF;
BEGIN
 UPDATE AUTHORS 
    SET AuthorName = 'John'
 WHERE
 (Author_ID = @Author_ID)
 SELECT @@ROWCOUNT 
END

В качестве альтернативы вы можете использовать @@ Error и увеличить идентификатор ошибки @@ rowcount> 1 (если вы хотите обновить только одну строку).

* 1013 например *

CREATE PROCEDURE [dbo].[DeleteAuthor]
(       
    @Author_ID int 
)
AS
    SET NOCOUNT OFF;
BEGIN
 DELETE FROM AUTHORS 
 WHERE
 (Author_ID = @Author_ID)

 IF @@ROWCOUNT <>1
 BEGIN
  RAISERROR ('An error occured',10,1)
  RETURN -1
 END
END

Как говорит Георгий, это будет возвращено в качестве кода возврата.

...