Sql 存储过程赢得';不要返回任何错误消息或错误号码
以下是我的insert存储过程:Sql 存储过程赢得';不要返回任何错误消息或错误号码,sql,sql-server,tsql,stored-procedures,error-handling,Sql,Sql Server,Tsql,Stored Procedures,Error Handling,以下是我的insert存储过程: CREATE PROCEDURE spainsert @A_Name nvarchar(50) AS BEGIN BEGIN TRY DECLARE Detailed_Error VAR_CHAR(MAX); Insert into A(A_Name) values(A_Name) END TRY BEGIN CATCH SELECT Detaile
CREATE PROCEDURE spainsert
@A_Name nvarchar(50)
AS BEGIN
BEGIN TRY
DECLARE Detailed_Error VAR_CHAR(MAX);
Insert into A(A_Name)
values(A_Name)
END TRY
BEGIN CATCH
SELECT
Detailed_Error = CAST(ERROR_NUMBER() AS VAR_CHAR ) + ' : '+ ERROR_MESSAGE() + ' : ' + CAST(ERROR_LINE() AS VAR_CHAR );
END CATCH
END
当我尝试输入NUMBER而不是NAME:exec spa insert 500
时,它不会显示任何错误,只会将该行保存到表中。你能帮我如何处理错误,如何知道号码和错误信息吗
谢谢大家!!
1234567875354654645654651541255435.4153241653535464654645654651541255435.415324165636524165135您插入的查询应该是错误的。请尝试此操作
CREATE PROCEDURE spainsert
@A_Name nvarchar(50)
AS BEGIN
BEGIN TRY
Insert into A(A_Name)
values(@A_Name)
END TRY
BEGIN CATCH
SELECT
CAST(ERROR_NUMBER() AS VAR_CHAR ) + ' : '+ ERROR_MESSAGE() + ' : ' + CAST(ERROR_LINE() AS VAR_CHAR )
END CATCH
END
问题是
sqlserver
隐式地将整数值转换为varchar
值。所以500被铸造成“500”。如果要验证,应在存储过程中进行验证:
IF @A_Name LIKE '%[^a-z ]%'
RAISERROR('Name contains some incorrect symbols', 16, 1)
如果名称包含除
a--z,a--z',
以外的符号,则会引发错误。您似乎忘记了包含相关的存储过程文本。CREATE proc dbo.spa将AName nvarchar(50)插入为BEGIN BEGIN尝试DECLARE DetailedError VARCHAR(MAX);插入(AName)值(AName)END TRY BEGIN CATCH SELECT DetailedError=CAST(错误号()为VARCHAR)+':'+错误消息()+':'+CAST(错误号()为VARCHAR);结束捕获结束您的问题,并在突出显示代码时使用{}
按钮。请不要将代码示例或示例数据放入注释中-因为您无法格式化它,所以阅读它非常困难。。。。取而代之的是:通过编辑你的问题来更新它,以提供额外的信息!谢谢。它只是隐式地将500转换为“500”,所以,当我尝试执行它时:exec spainsert 500(而不是名称),它会将该行保存到表中,并且不会返回任何SQL错误消息,例如:您输入了错误的数据类型,@AName不需要int,或者我不知道。如何避免这种情况,我的意思是如何限制它,只将名称(字母)保存到数据库中,而不保存数字或其他东西。是否发生了@A_Name是nvarchar(50)而应该是varchar(50)?关键字和表名是正确的,我使用空格或下划线,因为STACKOVERFLOW编辑器不允许我发布这个问题,所以我删除了“@”符号并分解了一些单词谢谢!你能帮助我如何处理错误吗?如果出现错误,如何向用户输出号码和错误消息?!示例:无效数据、无效数据类型、约束条件、外键、主键不存在etcIf它对给定投票有帮助。更多详细信息请参考此链接。谢谢!你能帮助我如何处理错误吗?如果出现错误,如何向用户输出号码和错误消息?!示例:无效数据、无效数据类型、约束、外键、主键不存在等@chova,您已经实现了一些正确的错误处理。你对此有什么问题吗?是的,spainsert需要一个名称参数,当我执行exec spainsert'test'->时,它保存该行,当我执行exec spainsert 5000->时,它也保存该行,但它不正常,因为它是一个数字,所以我想在输出中获得每个错误的数字和消息@切娃,你试过我的说法吗?当你将500传递给你的进程时,它不会抛出错误吗??