我想知道如果添加到存储过程中的表中,是否有办法返回值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中有效的想法?
答案 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可能会有所帮助。