Size: a a a

SqlCom.ru - Стиль жизни SQL

2020 June 23

P

Pavel in SqlCom.ru - Стиль жизни SQL
Владимир Боярских
commit  tran ArchiveTran лучше либо занести в блок TRY, либо обернуть как и rollback в @@TRANCOUNT, иначе ошибок не избежать
BEGIN TRAN ArchiveTran;
BEGIN TRY
SELECT 1 / 0;
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0 ROLLBACK TRAN ArchiveTran;
END CATCH
COMMIT TRAN ArchiveTran;
спасибо!
источник

ВБ

Владимир Боярских... in SqlCom.ru - Стиль жизни SQL
Pavel
В порядке бреда, строка кастуется к типу varchar(1) и соответственно усекается, либо поле вывода так отформатировано, что один символ выводит.. Попробуй в SELECT вывести, может что-то прояснится.
источник

T

Timus in SqlCom.ru - Стиль жизни SQL
Pavel
Почему-то выводит только символ "T"
запрос покажи.
источник

P

Pavel in SqlCom.ru - Стиль жизни SQL
Timus
запрос покажи.
--Select Count(AsyncOperationId)from AsyncOperationBase WITH (NOLOCK)
--where OperationType in (1, 9, 12, 25, 27, 10)
--AND StateCode = 3 AND StatusCode IN (30,32)

declare @starttime datetime=getDATE()
declare @endtime datetime
declare @iterationNumber int
declare @iterationtime datetime
declare @duration time
declare @message nvarchar(max)
declare @rowsPerIteration integer = 10000
declare @rowsLeft int
declare @totalrows int


declare @totalAsyncLogsForDelete TABLE  (
AsyncOperationId uniqueidentifier not null primary key
)

insert into  @totalAsyncLogsForDelete
Select AsyncOperationId  FROM ARCH_MSCRM.dbo.AsyncOperationBase (nolock)
     where OperationType in (1, 9, 12, 25, 27, 10) and StateCode = 3 AND StatusCode IN (30,32)

set @totalrows = (select count(*) from @totalAsyncLogsForDelete)
set @rowsLeft = @totalrows


while(@rowsLeft > 0)
begin
   
  begin try
 
   begin tran ArchiveTran
     set @iterationNumber = @iterationNumber + 1
     set @iterationtime = CURRENT_TIMESTAMP          

     -- Переменная для хранения сеансов, которые удаляются в рамках итерации
     declare @asyncLogsForDeletePerIteration
      TABLE  (
       AsyncOperationId uniqueidentifier not null primary key
         )

     -- Шаг 1. Сохраняем в переменную сеансы для удаления в текущей итерации
     INSERT INTO @asyncLogsForDeletePerIteration (AsyncOperationId)
     Select top (@rowsPerIteration) AsyncOperationId  FROM  @totalAsyncLogsForDelete
           
     -- Шаг 2.1 Архивируем POA
     select poa.* into Archive.dbo.PrincipalObjectAccess from ARCH_MSCRM.dbo.PrincipalObjectAccess poa
     join ARCH_MSCRM.dbo.WorkflowLogBase wlb on
     poa.ObjectId = wlb.WorkflowLogId
     join @asyncLogsForDeletePerIteration dart on
      wlb.AsyncOperationId = dart.AsyncOperationId
     
     -- Шаг 2.2 Удаляем POA
     delete poa  from ARCH_MSCRM.dbo.PrincipalObjectAccess poa
     join ARCH_MSCRM.dbo.WorkflowLogBase (nolock) wlb on
     poa.ObjectId = wlb.WorkflowLogId
     join @asyncLogsForDeletePerIteration dart on
      wlb.AsyncOperationId = dart.AsyncOperationId
             
     -- Шаг 3.1  Архивируем WorkflowLogBase
     select w.* into Archive.dbo.WorkflowLogBase from WorkflowLogBase (nolock) W , @asyncLogsForDeletePerIteration d
     where   W.AsyncOperationId = d.AsyncOperationId
     
     -- Шаг 3.2  Удаляем WorkflowLogBase
     delete WorkflowLogBase  from WorkflowLogBase W, @asyncLogsForDeletePerIteration d
     where   W.AsyncOperationId = d.AsyncOperationId
     
     -- Шаг 4.1 Архивируем BulkDeleteFailureBase
     Select B.* into Archive.dbo.BulkDeleteFailureBase From BulkDeleteFailureBase (nolock) B, @asyncLogsForDeletePerIteration d
     where   B.AsyncOperationId = d.AsyncOperationId

     -- Шаг 4.2 Удаляем BulkDeleteFailureBase
     delete BulkDeleteFailureBase From BulkDeleteFailureBase (nolock) B, @asyncLogsForDeletePerIteration d
     where   B.AsyncOperationId = d.AsyncOperationId

     -- Шаг 5.1 Архивируем BulkDeleteOperationBase
     select O. * into Archive.dbo.BulkDeleteOperationBase From BulkDeleteOperationBase (nolock) O, @asyncLogsForDeletePerIteration d
     where  O.AsyncOperationId = d.AsyncOperationId

     -- Шаг 5.2 Удаляем BulkDeleteOperationBase
     delete BulkDeleteOperationBase From BulkDeleteOperationBase (nolock) O, @asyncLogsForDeletePerIteration d
     where  O.AsyncOperationId = d.AsyncOperationId
     

     --Шаг 6.1 Архивируем WorkflowWaitSubscriptionBase
     SELECT WS.* INTO Archive.dbo.WorkflowWaitSubscriptionBase from WorkflowWaitSubscriptionBase (nolock) WS, @asyncLogsForDeletePerIteration d
     where  WS.AsyncOperationId = d.AsyncOperationID

     --Шаг 6.2 Удаляем WorkflowWaitSubscriptionBase и архивируем
     delete WorkflowWaitSubscriptionBase from WorkflowWaitSubscriptionBase WS, @asyncLogsForDeletePerIteration d
     where  WS.AsyncOperationId = d.AsyncOperationID
источник

P

Pavel in SqlCom.ru - Стиль жизни SQL
Timus
запрос покажи.
--Шаг 7.1 Архивируем AsyncOperationBase
     SELECT aob.* INTO Archive.dbo.AsyncOperationBase FROM ARCH_MSCRM.dbo.AsyncOperationBase (nolock) aob
     inner join @asyncLogsForDeletePerIteration as asyncForDel on asyncForDel.AsyncOperationId = aob.AsyncOperationId

     --Шаг 7.2 Удаляем AsyncOperationBase
     Delete aob FROM ARCH_MSCRM.dbo.AsyncOperationBase aob
     inner join @asyncLogsForDeletePerIteration as asyncForDel on asyncForDel.AsyncOperationId = aob.AsyncOperationId
     
     --Шаг 8. Удаляем из обработанные записи из переменной со всеми сеансами в рамках текущего задания
     Delete total from @totalAsyncLogsForDelete total
     inner join @asyncLogsForDeletePerIteration iter on iter.AsyncOperationId = total.AsyncOperationId      
     
     --Шаг 9. Актализируем счетчики
     set @rowsLeft = @rowsLeft - (select count(*) from @asyncLogsForDeletePerIteration) ;
     set @duration = getdate()-@iterationtime;    

     set @message  = 'Iteration successfully compleated. Rows left' + isnull(CAST (@rowsLeft as nvarchar) ,'') + 'Iteration time: ' +  isnull(CAST(@iterationtime as nvarchar),'')
     
     RAISERROR(@message,0,1) WITH NOWAIT;

      commit  tran ArchiveTran
     end try
           
     begin catch
       if @@TRANCOUNT>0
         begin
           rollback TRANSACTION;
         end
       set @rowsLeft = @rowsLeft + @rowsPerIteration;
       declare @error nvarchar = concat('Transaction failed: ',  error_message(), ' on iteration: ', isnull(cast(@iterationNumber as nvarchar),'') , 'Error timestamp: ', ' Rows left :', isnull(cast( @rowsLeft as nvarchar),'')  )
       RAISERROR(@error,0,1) WITH NOWAIT;
     end catch    

 set @iterationtime = current_timestamp
end -- loop

set @endtime = Current_timestamp

declare @finalMessage nvarchar = 'Proccedure started at' + isnull(cast(@starttime as nvarchar),'')  + 'Finished at' +  isnull(cast( @endtime as nvarchar),'')
+ 'Rows processed: ' + isnull(cast (@totalrows as nvarchar), '')
RAISERROR(@finalMessage,0,1) WITH NOWAIT;
PRINT 'Compleated'
источник

G

GopoBot in SqlCom.ru - Стиль жизни SQL
Pavel, не флуди так много. Покараю.
источник

T

Timus in SqlCom.ru - Стиль жизни SQL
Pavel  ты про пастебин знаешь?
источник

P

Pavel in SqlCom.ru - Стиль жизни SQL
Timus
Pavel  ты про пастебин знаешь?
Нет
источник

G

GopoBot in SqlCom.ru - Стиль жизни SQL
Pavel, не флуди так много. Покараю.
источник

T

Timus in SqlCom.ru - Стиль жизни SQL
Pavel
Нет
так открой для себя https://pastebin.com/
источник

P

Pavel in SqlCom.ru - Стиль жизни SQL
источник

T

Timus in SqlCom.ru - Стиль жизни SQL
100$
источник

T

Timus in SqlCom.ru - Стиль жизни SQL
что сделать то хочешь?
источник

P

Pavel in SqlCom.ru - Стиль жизни SQL
Timus
что сделать то хочешь?
Сообщения выводить в процессе выполнения скрипта
источник

ВБ

Владимир Боярских... in SqlCom.ru - Стиль жизни SQL
Можешь loopback-сервер прикрутить для логгирования процесса в транзакции.
https://www.sql.ru/blogs/decolores/894
источник

A

Alexander in SqlCom.ru - Стиль жизни SQL
declare @error nvarchar = … - в этом дело, тут надо указывать размер явно, иначе так и будет 1 символ.
источник

ВБ

Владимир Боярских... in SqlCom.ru - Стиль жизни SQL
По-любому так и есть, усекается строка. А в приведенном ранее запросе было по-другому, сразу в PRINT вывод, минуя переменную.... Но самая большая проблема - это SELECT..INTO в цикле. Это так не работает...
источник

ВБ

Владимир Боярских... in SqlCom.ru - Стиль жизни SQL
Ну как-то так, например...
SELECT TOP (0) * INTO Archive.dbo.AsyncOperationBase FROM ARCH_MSCRM.dbo.AsyncOperationBase;
WHILE <...>
BEGIN
DELETE FROM ARCH_MSCRM.dbo.AsyncOperationBase OUTPUT deleted.* INTO Archive.dbo.AsyncOperationBase;
END;
SELECT * FROM Archive.dbo.AsyncOperationBase;
источник

🆂

🆂🅴🆁🅶🅴🆈... in SqlCom.ru - Стиль жизни SQL
снапшотами   mssql  базы    можно экономить  место для разворачивание баз  для программистов 1с? базы большие  а программистов много   и все хотят себе персональные базы
источник

A

Alexey in SqlCom.ru - Стиль жизни SQL
🆂🅴🆁🅶🅴🆈
снапшотами   mssql  базы    можно экономить  место для разворачивание баз  для программистов 1с? базы большие  а программистов много   и все хотят себе персональные базы
Если изменяй мало - может прокатить
источник