Общее количество вставленных строк в цикле - PullRequest
1 голос
/ 13 марта 2019

Из-за полного журнала транзакций я делю свои большие INSERT s следующим образом:

DECLARE @rc INT = 1;
WHILE @rc > 0
BEGIN
  BEGIN TRANSACTION;
    INSERT INTO MyTargetTable (Id, SendId, RecipientId)
    SELECT TOP (500000) SendRecipientId, SendId, RecipientId
    FROM #SendRecipients AS s
    WHERE NOT EXISTS (
        SELECT 1 FROM MyTargetTable AS t
        WHERE t.Id  = s.SendRecipientId
    ) 
    ORDER BY SendRecipientId
  SET @rc = @@ROWCOUNT;
  COMMIT TRANSACTION;
END;

Как я могу получить общее количество вставленных строк?

Ответы [ 2 ]

3 голосов
/ 13 марта 2019

Добавьте еще одну переменную для суммирования @@rowcount - вам может понадобиться использовать bigint, а не int.

DECLARE @rc INT = 1, @total bigint = 0;
WHILE @rc > 0
BEGIN
  BEGIN TRANSACTION;
    INSERT INTO MyTargetTable (Id, SendId, RecipientId)
    SELECT TOP (500000) SendRecipientId, SendId, RecipientId
    FROM #SendRecipients AS s
    WHERE NOT EXISTS (
        SELECT 1 FROM MyTargetTable AS t
        WHERE t.Id  = s.SendRecipientId
    ) 
    ORDER BY SendRecipientId
  SELECT @rc = @@ROWCOUNT, @Total += @@ROWCOUNT;
  COMMIT TRANSACTION;
END;
0 голосов
/ 13 марта 2019

Вы можете попробовать это - обновил ваш запрос.

DECLARE @rc INT = 0;
WHILE (1=1)
BEGIN
  BEGIN TRANSACTION;
    INSERT INTO MyTargetTable (Id, SendId, RecipientId)
    SELECT TOP (500000) SendRecipientId, SendId, RecipientId
    FROM #SendRecipients AS s
    WHERE NOT EXISTS (
        SELECT 1 FROM MyTargetTable AS t
        WHERE t.Id  = s.SendRecipientId
    ) 
    ORDER BY SendRecipientId
  SET @rc = @rc + @@ROWCOUNT;
  COMMIT TRANSACTION;

  IF (@@ROWCOUNT = 0)
  BEGIN
    BREAK;
  END

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