4

假设我们有执行简单操作的存储过程,如下所示:

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

在上述过程中,返回的 id 表示操作成功。

考虑与 的等价物DELETE

CREATE PROCEDURE [dbo].[DeleteAuthor]
(       
    @Author_ID int 
)
AS
    SET NOCOUNT OFF;
BEGIN
    DELETE FROM AUTHORS 
    WHERE
    (Author_ID = @Author_ID)
END
  • AUTHORS如果我们使用上述过程,我们如何知道操作成功并且成功删除了记录?
  • 有更新操作吗?
4

3 回答 3

5

你可以选择@@rowcount

它将向您显示受影响的行。

例如

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 并引发错误 ID @@rowcount > 1(如果您只想更新一行)。

例如

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

正如 Giorgi 所说,这将作为返回码返回。

于 2010-01-19T12:09:09.920 回答
3

您可以返回@@ROWCOUNT以确定您的上一条语句是否影响了任何记录。

于 2010-01-19T12:09:18.577 回答
1

您可以使用 return 语句从存储过程中返回值。如果没有错误,则该@@ERROR变量为零。

@@错误

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

 Return @@ERROR

END
于 2010-01-19T12:09:44.727 回答