2010-01-19 20 views
1

说,我们有存储过程(一个或多个)执行的简单操作如何使用存储过程检查删除/更新操作是否成功完成?

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是成功的操作的指示。

考虑这个

CREATE PROCEDURE [dbo].[DeleteAuthor] 
(  
    @Author_ID int 
) 
AS 
    SET NOCOUNT OFF; 
BEGIN 
DELETE FROM AUTHORS 
WHERE 
(Author_ID = @Author_ID) 
END 
  • 我们怎样才能知道手术很成功 和记录(作者)的 成功地取出,如果我们使用上面 程序?

  • 与更新操作相同吗?

感谢

回答

1

你可以选择@@ ROWCOUNT

它会告诉你受影响的行。

e.g

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(如果你只是想更新一列)。

e.g

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的说,这将作为返回代码返回。

+0

@约翰,如果语句不影响任何行,但发生了什么没有错误? – Giorgi 2010-01-19 12:11:32

+0

更新操作如何? – 2010-01-19 12:11:57

+0

@asdi,您可以使用@@ ROWCOUNT与更新操作相同的方式,但我不建议使用它,因为如果存储过程执行时没有错误,但没有行受到影响,它将返回0 – Giorgi 2010-01-19 12:15:04

3

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

+0

@Rubens,如果语句不影响任何行但未发生错误会怎么样? – Giorgi 2010-01-19 12:13:26

+0

你是对的,@Giorgi,但我会期望更新/删除语句影响在线应用程序的记录;底线是:取决于OP想要做什么 – 2010-01-19 12:19:22

2

您可以使用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 
+0

如果没有错误,则返回,但如果用户希望删除一条记录而它不在那里,该怎么办? – 2010-01-19 12:47:15

相关问题