SQL Server:存储过程返回值,用于添加到表中

时间:2016-05-16 19:01:31

标签: sql-server stored-procedures

我想知道如果添加到存储过程中的表中,是否有办法返回值0?

这样的事情:

CREATE PROC Test 
@Var1 int, @Var2 VARCHAR(10) AS
     If ( INSERT INTO myTable (Integer, Character) VALUES (@Var1, @Var2) )
         Return 1
     Else
         Return 0

有没有办法实现这个在SQL Server中有效的想法?

2 个答案:

答案 0 :(得分:2)

将您的问题视为学术问题,SQL Server支持TRY CATCH块:

CREATE PROC Test 
@Var1 int, @Var2 VARCHAR(10) AS
DECLARE @ret int;
BEGIN TRY
 INSERT INTO myTable (Integer, Character) VALUES (@Var1, @Var2) );
 SET @ret = 1
END TRY
BEGIN CATCH 
 SET @ret = 0;
END CATCH

RETURN @ret;

答案 1 :(得分:2)

如果XACT_ABORT为ON,并且INSERT上发生错误,则写入的存储过程将导致将SqlException发送到客户端。您的客户端可以捕获此异常,并使用它做一些聪明的事情。

此外,如果XACT_ABORT为ON,则可以在退出存储过程之前执行SQL BEGIN TRY / END TRY以捕获错误。请参阅Tab Alleman的答案,了解如何做到这一点。

请注意,“出错了”的一般错误代码使得在生产系统中调试实际问题变得困难。您可能最好让SQL Server生成异常。然后您的客户端可以在某处记录该异常。或者,您可以在成功时返回0,在失败时返回非零@@ERROR代码。

如果XACT_ABORT为OFF,则可以(取决于严重性)继续执行查询。然后,您需要以某种方式处理错误。一种可能性是这样的:

CREATE PROC Test 
@Var1 int, @Var2 VARCHAR(10) AS
BEGIN
    SET XACT_ABORT OFF
    INSERT INTO myTable (Integer, Character) VALUES (@Var1, @Var2)
    IF @@ERROR = 0
        RETURN 1 -- success
    ELSE
        RETURN 0 -- failure
END

另请参阅有关Returning Data by Using a Return Code的Microsoft TechNet文章。 RETURN statement documentation可能会有所帮助。