Нужен ли откат, если запрос завершен с ошибками? - PullRequest
2 голосов
/ 24 января 2012

У меня такой запрос:

use DataIncremental
go
DECLARE @row_terminator CHAR;
SET @row_terminator = CHAR(10); -- or char(10)

BEGIN TRAN tran2


DECLARE @stmt NVARCHAR(2000);
SET @stmt = '
  BULK INSERT accn_adjustments
   FROM ''C:\Users\agordon\Desktop\incrementaljan2012\accn_adjustments_201112302112.txt''
   WITH 
      (
        firstrow=2,
FIELDTERMINATOR = ''|''  ,
ROWS_PER_BATCH=10000
   ,ROWTERMINATOR='''+@row_terminator+'''
   )'
exec sp_executesql @stmt;
SET @stmt = '
  BULK INSERT accn_adjustments
   FROM ''C:\Users\agordon\Desktop\incrementaljan2012\accn_adjustments_201112312112.txt''
   WITH 
      (
        firstrow=2,
FIELDTERMINATOR = ''|''  ,
ROWS_PER_BATCH=10000
   ,ROWTERMINATOR='''+@row_terminator+'''
   )'
exec sp_executesql @stmt;
SET @stmt = '
  BULK INSERT accn_adjustments
   FROM ''C:\Users\agordon\Desktop\incrementaljan2012\accn_adjustments_201201022101.txt''
   WITH 
      (
        firstrow=2,
FIELDTERMINATOR = ''|''  ,
ROWS_PER_BATCH=10000
   ,ROWTERMINATOR='''+@row_terminator+'''
   )'
exec sp_executesql @stmt;
SET @stmt = '
  BULK INSERT accn_adjustments
   FROM ''C:\Users\agordon\Desktop\incrementaljan2012\accn_adjustments_201201032101.txt''
   WITH 
      (
        firstrow=2,
FIELDTERMINATOR = ''|''  ,
ROWS_PER_BATCH=10000
   ,ROWTERMINATOR='''+@row_terminator+'''
   )'
exec sp_executesql @stmt;

Причина, по которой я поставил begin tran tran2, заключается в том, чтобы убедиться, что при наличии ошибок я могу просто выполнить rollback

, который я запустилкод и сообщение, которое я получил, были "query completed with errors"

SSMS НЕ утверждал, что некоторые rows were inserted, как это обычно происходит.

Когда я пытался сделать rollback tran tran2, он сказал, чтоэта транзакция никогда не начиналась

Так что мой вопрос: были строки, зафиксированные в базе данных или нет?

Если нет, то почему он заявил «запрос завершен с ошибками»разве он просто сказал, что запрос не выполнен из-за ошибок?

Ответы [ 2 ]

2 голосов
/ 24 января 2012

Описание

Начиная с SQL Server 2005, вы можете использовать обработку ошибок, используя TRY CATCH

TRY ... CATCH (Transact-SQL) Реализует обработку ошибок для Transact-SQL, которая аналогична обработке исключений в языках Microsoft Visual C # и Microsoft Visual C ++.Группа операторов Transact-SQL может быть заключена в блок TRY.Если в блоке TRY возникает ошибка, управление передается другой группе операторов, заключенной в блок CATCH.

Пример

BEGIN TRY
    BEGIN TRANSACTION

     -- do something

    COMMIT TRAN -- Transaction successfull, commit!
END TRY
BEGIN CATCH
    IF @@TRANCOUNT > 0
        ROLLBACK TRAN --RollBack if error occured
END CATCH

Дополнительная информация

1 голос
/ 24 января 2012

С документация на БОЛЬШУЮ ВСТАВКУ :

Оператор BULK INSERT может быть выполнен в пределах определенного пользователем сделка. Откат пользовательской транзакции, которая использует BULK Оператор INSERT и BATCHSIZE для импорта данных в таблицу или Просмотр с использованием нескольких пакетов позволяет откатить все пакеты, отправленные на SQL Server.

sp_executesql содержится в самой внешней транзакции (той, с которой вы начинаете BEGIN TRANSACTION), поэтому все эти массовые вставки должны быть транзакционными как единое целое.

Как следует из комментария @ MartinSmith, XACT_ABORT мог прервать эту внешнюю транзакцию, если она слишком длинная.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...