gpt4 book ai didi

sql - SQL Server批处理错误处理问题

转载 作者:行者123 更新时间:2023-12-03 07:45:26 26 4
gpt4 key购买 nike

如何获得这批SQL,最后到达“回滚事务”部分? 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

最佳答案

在这种情况下,您的“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

关于sql - SQL Server批处理错误处理问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/668112/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com