在这种情况下,您的'ABS'是批量中止,因为它是一个CAST错误.在这里解释,在Erland Sommarskog的精彩文章中
你必须阅读这篇文章.比你需要了解的SQL错误处理更多.
此外,您必须测试每个语句.如果第一个INSERT失败,你仍然继续执行(除非你有XACT_ABORT ON.
BEGIN TRAN CREATE TABLE TempTable (c1 INT NULL) INSERT INTO TempTable (c1) SELECT 1 IF @@ERROR <> 0 GOTO errhandler INSERT INTO TempTable (c1) SELECT 'ABS' IF @@ERROR <> 0 GOTO errhandler PRINT 'no error' COMMIT TRAN GOTO exitpoint errhandler: PRINT 'error' -- Why does it never get here??????? ROLLBACK TRAN exitpoint:
如果您有SQL Server 2000,那么除了添加更多检查,ISNUMERIC等之外,您没有很多选项.
如果您有SQL Server 2005,那么您应该真正使用新技术.几乎所有代码和执行错误都被清楚地捕获.
BEGIN TRY BEGIN TRAN CREATE TABLE TempTable (c1 INT NULL) INSERT INTO TempTable (c1) SELECT 1 INSERT INTO TempTable (c1) SELECT 'ABS' PRINT 'no error' COMMIT TRAN END TRY BEGIN CATCH PRINT 'error' --It will get here for SQL 2005 ROLLBACK TRAN END CATCH