如果 SECOND 语句失败 SQL,则不要执行 FIRST 语句

时间:2021-02-17 15:43:44

标签: sql tsql

如果用户在第二条语句运行之前停止查询执行,我必须在一个块中执行整个过程,以防止大量数据丢失。

SET XACT_ABORT ON 在发生错误时中止批处理 当用户停止执行时,我需要类似的东西。

GO

CREATE PROCEDURE [dbo].[sp_Users] 
AS
BEGIN
    -- Statement 1:
   DELETE FROM Users

    -- Statement 2:
   INSERT INTO Users VALUES 
   (1,'John','Whatever')
   ,(4,'Jessy',NULL)
   ,(5,'Adam',NULL)

END

1 个答案:

答案 0 :(得分:0)

我认为使用带有错误条件语句的事务是可行的。所有在一个事务中,您都可以运行第一个删除语句。然后,您可以使用 MS SQL 全局变量 @@ERROR 查找错误,以确定 proc 是否应继续执行第二个语句。如果一切顺利,则提交事务,否则整个事务将回滚。对于全局变量,如果您不是要查找错误而是要查找受影响的行,@@ROWCOUNT 可能会有所帮助。

BEGIN TRANSACTION StatementsTest
      -- Statement 1:
    DELETE FROM Users

IF  @@ERROR = 0
    BEGIN
    -- Statement 2:
    INSERT INTO Users VALUES 
    (1,'John','Whatever')
    ,(4,'Jessy',NULL)
    ,(5,'Adam',NULL)

    COMMIT TRANSACTION StatementsTest
    END
ELSE    
    BEGIN
    ROLLBACK TRANSACTION StatementsTest
    END