如何让这批SQL最终到达RollBack Transaction部分? SQL只是停止在坏代码行上停止脚本执行。我知道我可以使用try / catch构造,但是我更感兴趣的是在SQL添加try / catch之前这是如何处理的。
BEGIN TRAN
CREATE TABLE TempTable (c1 INT NULL)
INSERT INTO TempTable (c1) SELECT 1
INSERT INTO TempTable (c1) SELECT 'ABS'
IF (@@ERROR = 0)
BEGIN
PRINT 'no error'
COMMIT TRAN
END
ELSE
BEGIN
PRINT 'error' -- Why does it never get here???????
ROLLBACK TRAN
END
答案 0 :(得分:8)
在这种情况下,您的'ABS'是批量中止,因为它是CAST错误。 这里的解释是Erland Sommarskog's excellent article
你必须阅读这篇文章。您需要了解的有关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