Sql server 2005 SQL 2005 try/catch块从未达到“catch”despte伪数据测试
好的,我对SQL 2005错误处理和am不是很有经验 学习如何处理try/catch语句 我已经写了下面的程序,但不管我传递给它什么, 我的ErrorLog表中从来没有任何数据。我通过了所有考试 不在数据库中的值、所有日期时间值或数据字符串 并获取“0行生效”,错误日志中未报告任何内容。它是 就好像从来没有达到CATCH语句的价值一样,我 我们也尝试在顶部对验证进行注释 你知道我做错了什么吗?谢谢Sql server 2005 SQL 2005 try/catch块从未达到“catch”despte伪数据测试,sql-server-2005,try-catch,Sql Server 2005,Try Catch,好的,我对SQL 2005错误处理和am不是很有经验 学习如何处理try/catch语句 我已经写了下面的程序,但不管我传递给它什么, 我的ErrorLog表中从来没有任何数据。我通过了所有考试 不在数据库中的值、所有日期时间值或数据字符串 并获取“0行生效”,错误日志中未报告任何内容。它是 就好像从来没有达到CATCH语句的价值一样,我 我们也尝试在顶部对验证进行注释 你知道我做错了什么吗?谢谢 ALTER PROCEDURE [dbo].[aspnet_Membership_UpdateLa
ALTER PROCEDURE [dbo].[aspnet_Membership_UpdateLastActivityDate]
@UserId nvarchar(256),
@UserName nvarchar(256),
@LastActivityDate datetime,
@ApplicationName nvarchar(256)
AS
DECLARE @Today DATETIME
DECLARE @MSG VARCHAR(255)
DECLARE @Severity INT
DECLARE @ErrorCode INT
BEGIN
SET XACT_ABORT ON -- (I have also tried it without XACT_ABORT. No difference)
BEGIN TRY
SET @ErrorCode = 0
SELECT @Today = GetDate()
IF (@UserId IS NULL)
RETURN(1)
IF (@UserName IS NULL)
RETURN(1)
IF (@LastActivityDate IS NULL)
RETURN(1)
BEGIN TRAN
UPDATE dbo.aspnet_Users WITH (ROWLOCK)
SET LastActivityDate = @LastActivityDate
FROM dbo.aspnet_Users u
INNER JOIN dbo.aspnet_Applications a
ON u.ApplicationId = a.ApplicationId
WHERE u.UserName = @UserName
AND u.UserId = @UserId
AND a.ApplicationName = @ApplicationName
COMMIT TRAN
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK TRAN
SET @ErrorCode = Error_Number()
SET @Severity = Error_Severity()
SET @MSG = 'An error was thrown: '
+ 'Error(' + @ErrorCode + '):' + ERROR_MESSAGE()
+ ' Severity = ' + ERROR_SEVERITY()
+ ' State = ' + ERROR_STATE()
+ ' Procedure = ' + ERROR_PROCEDURE()
+ ' Line Number = ' + ERROR_LINE()
INSERT INTO [dbo].[ErrorLog]([errornum], [errortype], [errormsg],[errorsource], [errordate])
VALUES (@ErrorCode, 'E', @MSG, Error_Procedure(), @Today)
RAISERROR(@MSG, @Severity, 2)
END CATCH
END
RETURN @ErrorCode
我在SQL错误处理方面做了很多工作已经有一段时间了,但我看不到任何可能产生错误的地方。您是否希望捕获返回语句?这是不会发生的…他们只会从函数返回。您需要引发错误,而不是触发返回。我在SQL错误处理方面做了很多工作,但我没有看到任何可能产生错误的地方。您是否希望捕获返回语句?这是不会发生的…他们只会从函数返回。您需要提出错误,而不是触发返回。同意@Mark。尝试更改此选项:
IF (@UserId IS NULL)
RETURN(1)
为此:
IF (@UserId IS NULL)
BEGIN
RAISERROR('No UserID was passed in.', 11, 1);
RETURN 1;
END
另请参阅本文,以了解Erland Sommarskog编写的一本极好的错误处理入门读物:
同意@Mark。尝试更改此选项:
IF (@UserId IS NULL)
RETURN(1)
为此:
IF (@UserId IS NULL)
BEGIN
RAISERROR('No UserID was passed in.', 11, 1);
RETURN 1;
END
另请参阅本文,以了解Erland Sommarskog编写的一本极好的错误处理入门读物:
换句话说:捕获不是最终的。回答得不错,+1。这是真的@Aaronaught。T-SQL中的错误处理还远未完成,但它们正在取得进展,我希望在下一个完整版本的SQL Server中看到一些不错的工作项目,例如2008 R2之后。感谢您的帮助。似乎我混淆了过程性select语句错误检查,例如,当一个语句返回null并带有try-catch块错误时,表就不存在了。谢谢你为我澄清这一点。这就是所谓的一切-换句话说:捕获不是最终的。回答得不错,+1。这是真的@Aaronaught。T-SQL中的错误处理还远未完成,但它们正在取得进展,我希望在下一个完整版本的SQL Server中看到一些不错的工作项目,例如2008 R2之后。感谢您的帮助。似乎我混淆了过程性select语句错误检查,例如,当一个语句返回null并带有try-catch块错误时,表就不存在了。谢谢你为我澄清这一点。这就是所谓的一切-谢谢,夏尔巴密码,选择我的答案作为答案。谢谢,夏尔巴密码,选择我的答案作为答案。谢谢Erland的链接Aaron。这非常有帮助。既然没有“协助”选项,我就投票给你。再次感谢!感谢Erland的链接Aaron。这非常有帮助。既然没有“协助”选项,我就投票给你。再次感谢!