如何 return 存储过程中的错误并插入 table
How to return an error in a stored procedure and insert into a table
我不太了解 SQL 服务器,但基本上我这里有一个存储过程,应该将参数(id(主键)和测试数据)插入到测试中 table, 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
它 return 是一个填充的 dbo.Test,一个空的 dbo.Error_Log 和一个 return 由于某种原因的 -4 值
错误是:
Msg 2627, Level 14, State 1, Procedure uspTester, Line 21
Violation of PRIMARY KEY constraint 'PK__Test__3214EC0775996C4D'.
Cannot insert duplicate key in object 'dbo.Test'. The duplicate key
value is (1). The statement has been terminated.
我需要将该错误输出到 dbo.Error_Log 而不是完全停止操作。
@@ERROR 变量"returns the error number for the last Transact-SQL statement executed" 即您需要在尝试插入后检查@@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/en-us/library/ms190358.aspx
我不太了解 SQL 服务器,但基本上我这里有一个存储过程,应该将参数(id(主键)和测试数据)插入到测试中 table, 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
它 return 是一个填充的 dbo.Test,一个空的 dbo.Error_Log 和一个 return 由于某种原因的 -4 值
错误是:
Msg 2627, Level 14, State 1, Procedure uspTester, Line 21 Violation of PRIMARY KEY constraint 'PK__Test__3214EC0775996C4D'. Cannot insert duplicate key in object 'dbo.Test'. The duplicate key value is (1). The statement has been terminated.
我需要将该错误输出到 dbo.Error_Log 而不是完全停止操作。
@@ERROR 变量"returns the error number for the last Transact-SQL statement executed" 即您需要在尝试插入后检查@@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/en-us/library/ms190358.aspx