使用存储过程时如何检查删除/更新操作是否成功完成?

Asa*_*sad 4 c# sql-server stored-procedures tableadapter

假设我们有存储过程执行这样的简单操作:

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
Run Code Online (Sandbox Code Playgroud)

在上面的过程中,返回的id是操作成功的标志。

考虑等价于DELETE

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

Joh*_*lan 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
Run Code Online (Sandbox Code Playgroud)

这也可以应用于更新。

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
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用 @@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
Run Code Online (Sandbox Code Playgroud)

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