Ste*_*a D 11 sql t-sql sql-server stored-procedures sql-server-2005
我正在使用SQL Server 2005.我创建了一个大部分时间都可以工作的存储过程,但是我找到了一个不能满足我想要的实例.
目前,代码执行类似的操作
if @@error <> 0
begin
select @message_error = "There was a database error adding product "+ @product + " to product line
end
Run Code Online (Sandbox Code Playgroud)
@message_error输出变量在哪里.
所以,我可以select @@error得到一个数字,但我真正想要的只是SQL错误.
像嘿这样的东西,我不能这样做,因为这个列上有一个fk约束或者其他什么.我在msdn上找到了这篇文章 http://msdn.microsoft.com/en-us/library/ms178592(v=sql.90).aspx
但它只会抛出自定义异常RAISERROR,我不想创建自己的错误消息或异常,我只是想知道为什么东西不起作用.我可以通过Management Studio执行存储过程并查看确切的SQL错误,但尝试匹配来自站点的数据并手动插入它是很乏味的.
如何将SQL错误文本转换为输出变量?
Phi*_*ley 19
这是我使用的存储过程模板的一部分:
/* CREATE PROCEDURE... */
DECLARE
@ErrorMessage varchar(2000)
,@ErrorSeverity tinyint
,@ErrorState tinyint
/* Additional code */
BEGIN TRY
/* Your code here */
END TRY
BEGIN CATCH
SET @ErrorMessage = ERROR_MESSAGE()
SET @ErrorSeverity = ERROR_SEVERITY()
SET @ErrorState = ERROR_STATE()
RAISERROR(@ErrorMessage, @ErrorSeverity, @ErrorState)
BREAK
END CATCH
/* Further cleanup code */
Run Code Online (Sandbox Code Playgroud)
Try/Catch块可能很棘手但比@@ error更彻底.更重要的是,您可以使用其中的各种error_xxx()函数.在这里,我将正确的错误消息存储在变量@ErrorMessage中,还有足够的其他数据来重新引发错误.从这里可以获得任意数量的选项; 你可以让@ErrorMessage成为一个输出变量,测试并处理特定的错误,或者构建你自己的错误消息(或者调整现有错误消息更清楚 - 你可能会感到烦恼,找出你想要这样做的频率).其他选项将提出这些问题.
需要注意的事项:在某些情况下,SQL会重新抛出两个错误消息......并且error_message()只捕获最后一个错误消息,这通常会说"尝试创建对象失败",其中包含真正的错误第一条错误消息.这是构建您自己的错误消息的地方.
Myl*_*s J 12
您可以使用常规Try/Catch,然后在CATCH部分中构建有关错误的更多详细信息,例如
DECLARE @DetailedErrorDesc VARCHAR(MAX)
BEGIN TRY
--tsql code goes here
END TRY
BEGIN CATCH
SELECT @DetailedErrorDesc =
CAST(ERROR_NUMBER() AS VARCHAR) + ' : '+
CAST(ERROR_SEVERITY() AS VARCHAR) + ' : ' +
CAST(ERROR_STATE() AS VARCHAR) + ' : ' +
ERROR_PROCEDURE() + ' : ' +
ERROR_MESSAGE() + ' : ' +
CAST(ERROR_LINE() AS VARCHAR);
--Now you can decide what to do with the detailed error message....return it or log it etc
END CATCH
Run Code Online (Sandbox Code Playgroud)