簡體   English   中英

如何在存儲過程中返回錯誤並插入表中

[英]How to return an error in a stored procedure and insert into a table

我對SQL Server不太了解,但是本質上我這里是一個存儲過程,應該將參數(id(主鍵)和Test數據)插入測試表dbo.test中

如果添加失敗,則應使用ID,測試數據和錯誤信息將其添加到dbo.Error_Log。

我的存儲過程如下所示:

    @Id int = 0, 
    @Test_column nvarchar(10) = 0
AS
BEGIN

    SET NOCOUNT ON;


    IF @@ERROR <> 0
        BEGIN
        INSERT INTO AdventureWorks2012.dbo.Error_Log ([Id], [Data], [Error_description])
        SELECT  @Id,
                @Test_column,
                @@ERROR
        END
        ELSE
    INSERT INTO AdventureWorks2012.dbo.Test ([Id], [Test_column])
    SELECT  @Id, 
            @Test_column
END

我正在像這樣執行它:

USE [AdventureWorks2012]
GO

DECLARE @return_value int

EXEC    @return_value = [dbo].[uspTester]
        @Id = 1,
        @Test_column = N'data123'

SELECT  'Return Value' = @return_value

GO


SELECT * FROM AdventureWorks2012.dbo.Test
SELECT * FROM AdventureWorks2012.dbo.Error_Log

由於某種原因,它將返回填充的dbo.Test,空的dbo.Error_Log和返回值-4

錯誤是:

消息2627,級別14,狀態1,過程uspTester,行21違反主鍵約束'PK__Test__3214EC0775996C4D'。 無法在對象“ dbo.Test”中插入重復密鑰。 重復鍵值為(1)。 該語句已終止。

我需要將該錯誤輸出到dbo.Error_Log中,而不僅僅是完全停止操作。

@@ ERROR變量“返回最后執行的Transact-SQL語句的錯誤號”,即,嘗試插入后需要檢查@@ ERROR。 像這樣:

BEGIN

SET NOCOUNT ON;


INSERT INTO AdventureWorks2012.dbo.Test ([Id], [Test_column])
SELECT  @Id, 
        @Test_column

IF @@ERROR <> 0
    BEGIN
    INSERT INTO AdventureWorks2012.dbo.Error_Log ([Id], [Data], [Error_description])
    SELECT  @Id,
            @Test_column,
            @@ERROR
    END
END

注意:如果您想要錯誤消息而不是數字,則可以使用ERROR_MESSAGE()函數: http : //msdn.microsoft.com/zh-cn/library/ms190358.aspx

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM