【问题标题】:Dynamic SQL Exception Handling in SQL ServerSQL Server 中的动态 SQL 异常处理
【发布时间】:2013-08-27 17:03:53
【问题描述】:

我正在通过 Java 在 SQL Server 2008 上执行以下动态 SQL:

BEGIN TRY 
  BEGIN TRAN T1; 
  DELETE FROM [MyDatabase].[dbo].[MyTable]; 
  DECLARE @bulk_cmd nvarchar(max); 
  SET @bulk_cmd = 'BULK INSERT ... '; 
  EXEC (@bulk_cmd); 
  COMMIT TRAN T1; 
END TRY 
BEGIN CATCH 
  ROLLBACK TRAN T1;
  DECLARE @ErrorMessage NVARCHAR(4000), @ErrorSeverity INT, @ErrorState INT; 
  SELECT @ErrorMessage = ERROR_MESSAGE(), @ErrorSeverity = ERROR_SEVERITY(), @ErrorState = ERROR_STATE(); 
  RAISERROR (@ErrorMessage, @ErrorSeverity, @ErrorState);  
END CATCH;

如果@bulk_cmd 中提供的 SQL 包含错误,我可以在 SSMS 中看到,但是当我在 Java 中执行时,没有捕获到异常。 Java 非常标准:

Statement stmt = null;      
try {                       
    stmt = conn.createStatement();
    stmt.executeUpdate(sql);
    logger.debug("SQL command executed.");
} catch (Exception ex) {            
    logger.debug("SQL command failed.");
    throw ex;
} finally {    
    if (stmt != null) {
        stmt.close();
    }
}

如果我弄乱了 SQL(在动态部分之外),它会捕获语法错误。但是为什么动态SQL产生的错误没有被Java捕获呢?

【问题讨论】:

    标签: java sql-server sql-server-2008


    【解决方案1】:

    找到解决方案here

    在 SQL 开头添加 SET NOCOUNT ON; 解决了该问题。现在我的异常被 Java 捕获了。

    【讨论】:

      【解决方案2】:

      比较难处理,可以检查一下

      dbo.spGet_LastErrorMessage;
      

      或检查

       @@error
      

      但是,如果您是从 java 发送命令,为什么 DDBB 中有业务逻辑?为什么不使用 java 构建查询,然后将命令作为常规 SQL 查询执行?

      【讨论】:

      • 我在 BULK INSERT 命令中使用特殊字符。如果我不动态生成命令,它将不是有效的语法。
      • 你可以动态生成命令,但是在应用程序端而不是 DDBB 端,不是吗?
      • 是的,我测试了它,看起来也可以。不确定 CHAR 是否能在 Java 和 SQL Server 之间正确转换。
      • @Paul 除了是一个可行的解决方案之外,将业务逻辑保留在应用程序中而不是 DDBB 中是一种更好的设计。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-10
      • 2014-05-08
      相关资源
      最近更新 更多