我正在通过 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 捕获呢?