1

我正在通过 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;

如果中提供的 SQL@bulk_cmd包含错误,我可以在 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 捕获呢?

4

2 回答 2

2

在这里找到解决方案。

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

于 2013-08-27T17:14:28.017 回答
0

比较难处理,可以查

dbo.spGet_LastErrorMessage;

或检查

 @@error

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

于 2013-08-27T17:11:06.263 回答