2010-01-19 19 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

相關問題