use*_*915 2 t-sql sql-server stored-procedures transactions
假设我在SQL服务器中有一个程序:
create procedure BULKINSERT
AS
INSERT INTO TABLEB (
SELECT NAME, ID From TableA
)
GO
Run Code Online (Sandbox Code Playgroud)
一个简单的一个读取数据从TABLE A并插入到TABLE B。如果我有 100 万条记录要插入到表 B 中,并且如果一条记录由于某种原因失败,在这种情况下我应该使用TRANSACTION还是不使用?
我应该回滚整个操作吗?
您可以为存储过程使用以下模板:
SET NOCOUNT, XACT_ABORT ON;
BEGIN TRY
BEGIN TRANSACTION;
-- CODE BLOCK GOES HERE
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
BEGIN
ROLLBACK TRANSACTION
END;
-- GET ERRORS DETAILS OR THROW ERROR
END CATCH;
SET NOCOUNT, XACT_ABORT OFF;
Run Code Online (Sandbox Code Playgroud)
更多细节:
XACT_ABORT - 指定当 Transact-SQL 语句引发运行时错误时 SQL Server 是否自动回滚当前事务;
如果您需要有关错误的信息(ERROR_MESSAGE , ERROR_LINE, ERROR_NUMBER, ERROR_PROCEDURE, ERROR_SEVERITY, ERROR_STATE)
这是处理事务的通用技术。我会推荐以下文章Erland Sommarskog: