You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在SQL抛出的错误信息中添加日期和时间?

如何为SQL错误信息添加日期和时间

当然可以实现这个需求!你不用额外的错误相关函数,只需要在捕获错误的逻辑里结合获取当前时间的函数,把日期时间和现有的错误信息拼接起来就搞定了。

核心思路

在TRY/CATCH块的CATCH部分,使用GETDATE()(或SYSDATETIME(),精度更高)获取当前的日期时间,再通过字符串拼接,把时间信息插入到你想要的错误信息位置。

示例代码(SQL Server)

基础实现(直接输出带时间的错误信息)

BEGIN TRY
    -- 模拟会抛出错误的SQL语句(比如除零错误)
    SELECT 1 / 0;
END TRY
BEGIN CATCH
    -- 拼接错误信息与日期时间,格式和你期望的一致
    SELECT 
        'Msg ' + CAST(ERROR_NUMBER() AS VARCHAR) 
        + ', Level ' + CAST(ERROR_SEVERITY() AS VARCHAR) 
        + ', State ' + CAST(ERROR_STATE() AS VARCHAR) 
        + ', Line ' + CAST(ERROR_LINE() AS VARCHAR) 
        + ', ' + FORMAT(GETDATE(), 'MM/dd/yyyy') 
        + ' , ' + FORMAT(GETDATE(), 'HH:mm') 
        + ' , ' + ERROR_MESSAGE() AS FormattedErrorMessage;
END CATCH

执行这段代码后,你会得到类似这样的输出:

Msg 8134, Level 16, State 1, Line 5, 04/02/2024 , 14:35 , Divide by zero error encountered.

兼容低版本SQL Server(2012以前不支持FORMAT函数)

如果你的SQL Server版本低于2012,可以用CONVERT函数来格式化时间:

BEGIN TRY
    SELECT 1 / 0;
END TRY
BEGIN CATCH
    SELECT 
        'Msg ' + CAST(ERROR_NUMBER() AS VARCHAR) 
        + ', Level ' + CAST(ERROR_SEVERITY() AS VARCHAR) 
        + ', State ' + CAST(ERROR_STATE() AS VARCHAR) 
        + ', Line ' + CAST(ERROR_LINE() AS VARCHAR) 
        + ', ' + CONVERT(VARCHAR, GETDATE(), 101) -- 101对应MM/dd/yyyy格式
        + ' , ' + LEFT(CONVERT(VARCHAR, GETDATE(), 108), 5) -- 108对应HH:mm:ss,取前5位得HH:mm
        + ' , ' + ERROR_MESSAGE() AS FormattedErrorMessage;
END CATCH

进阶:将错误记录到日志表

如果需要持久化错误信息,推荐单独存储日期时间列(比拼接字符串更灵活),示例如下:

-- 先创建错误日志表
CREATE TABLE ErrorLog (
    LogID INT IDENTITY(1,1) PRIMARY KEY,
    ErrorNumber INT,
    ErrorSeverity INT,
    ErrorState INT,
    ErrorLine INT,
    ErrorDateTime DATETIME DEFAULT GETDATE(),
    ErrorMessage NVARCHAR(4000)
);

-- 捕获错误并插入日志表
BEGIN TRY
    SELECT 1 / 0;
END TRY
BEGIN CATCH
    INSERT INTO ErrorLog (
        ErrorNumber, ErrorSeverity, ErrorState, ErrorLine, ErrorMessage
    )
    VALUES (
        ERROR_NUMBER(), ERROR_SEVERITY(), ERROR_STATE(), ERROR_LINE(), ERROR_MESSAGE()
    );

    -- 同时输出格式化后的错误信息
    SELECT 
        'Msg ' + CAST(ERROR_NUMBER() AS VARCHAR) 
        + ', Level ' + CAST(ERROR_SEVERITY() AS VARCHAR) 
        + ', State ' + CAST(ERROR_STATE() AS VARCHAR) 
        + ', Line ' + CAST(ERROR_LINE() AS VARCHAR) 
        + ', ' + CONVERT(VARCHAR, GETDATE(), 101) 
        + ' , ' + LEFT(CONVERT(VARCHAR, GETDATE(), 108), 5) 
        + ' , ' + ERROR_MESSAGE() AS FormattedErrorMessage;
END CATCH

关键点说明

  • GETDATE():返回当前数据库系统的日期和时间,精度到毫秒;SYSDATETIME()精度更高(到纳秒),可以根据需求选择。
  • 格式化函数:FORMAT函数更直观易读,但仅支持SQL Server 2012及以上版本;低版本用CONVERT配合样式代码即可。

内容的提问来源于stack exchange,提问作者Murilo lima alves

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:38:52