sql 서버 는 아 카 이브 유 니 버 설 템 플 릿 스 크 립 트 를 작성 하여 데 이 터 를 자동 으로 분할 삭제 합 니 다.

블 로 거들 은 비교적 많은 프로젝트 의 archive 스 크 립 트 를 작 성 했 습 니 다.이러한 데 이 터 를 삭제 하 는 스 크 립 트 개발 은 처음에 가장 간단 한 delete 문 구 를 사 용 했 을 것 입 니 다.그리고 일부 표 의 데이터 양 이 비교적 많 기 때문에 색인 이 비교적 많 습 니 다.데 이 터 를 삭제 하 는 것 이 느 리 고 시스템 의 정상 적 인 사용 에 영향 을 미 치 는 것 을 발견 할 수 있 습 니 다.그 다음 에 delete 문 구 를 균일 한 데 이 터 량 에 따라 delete 를 바 꾸 었 습 니 다.그러면 원래 표 하 나 를 삭제 하고 한 문 구 를 사용 하면 몇 십 줄 이 될 수 있 습 니 다.만약 에 archive 의 표 가 10 여 개,심지어 몇 십 개 라면 우리 의 스 크 립 트 편폭 은 매우 크 고 개발 과 유지 비용 을 증가 하여 경험 이 비교적 적은 새로운 입사 동료 가 archive 스 크 립 트 를 개발 하 는 데 불리 합 니 다.이른바 분할 논리 에 도 주 의 를 분산 시 키 기 쉽다.
이러한 상황 에 따라 이번 주 블 로 거(zhang 502219048)는 마침 작업 과정 에서 데 이 터 를 자동 으로 분할 삭제 하 는 템 플 릿 을 정리 하고 작 성 했 습 니 다.템 플 릿 은 고정 되 어 있 지 않 습 니 다.delete 구문 에 만 집중 하고 delete 구문 에서 모든 삭 제 된 데 이 터 를 제어 할 수 있 습 니 다.비교적 편리 합 니 다.변 수 를 통 해 템 플 릿 sql 을 조립 할 수 있 습 니 다.표 마다 분할 논리 적 중복 코드 를 따로 쓰 지 않 고 복잡 하 게 간소화 하 며,표 의 지정 한 데 이 터 를 추가 로 삭제 하면 몇 줄 의 코드 만 추가 하면 된다(아래 의 demo 1 과 demo 2).
demo 1:매개 변수 없 이 표 tmpDel 은 표 A 에 대응 하 는 ID 의 데 이 터 를 삭제 합 니 다.
demo 2:Date 필드 가 만 료 되 었 는 지 여부 에 따라 표 B 에 대응 하 는 데 이 터 를 삭제 합 니 다.
구체 적 으로 아래 의 스 크 립 트 와 관련 설명 을 참고 하 세 요.모 르 는 부분 이 있 으 면 댓 글 이나 개인 편지 로 블 로 거들 에 게 문의 하 세 요.

-- ===== 1   archive   =======================================================
--【          】
/* 
  :
1.    archive   :@sql = @sql_Part1 + @sql_Del + @sql_Part2
2.      @parameters :@parameters = @parameters_Base +      
3.     :@strStepInfo   print step  
4. archive     @sql_Del,       。
*/
declare @parameters nvarchar(max) = ''
, @parameters_Base nvarchar(max) = N'@strStepInfo nvarchar(100)'
, @sql nvarchar(max) = ''
, @sql_Part1 nvarchar(max) = N'
declare @iBatch int = 1,   --  
    @iRowCount int = -1 --    ,   -1,         @@ROWCOUNT
print convert(varchar(50), getdate(), 121) + @strStepInfo
while @iRowCount <> 0
begin
  print ''begin batch:''
  print @iBatch
  print convert(varchar(50), getdate(), 121)
  begin try
    begin tran
'
, @sql_Del nvarchar(max) = '
' --@sql_Del                    
, @sql_Part2 nvarchar(max) = N'  
      select @iRowCount = @@rowcount
    commit tran 
  end try
  begin catch
    rollback tran
    print ''-- Error Message:'' + convert(varchar, error_line()) + '' | '' + error_message()
  end catch
  waitfor delay ''0:00:01'' --  
  print convert(varchar(50), getdate(), 121)
  print ''end batch''
  select @iBatch = @iBatch + 1
end'
-- ===== 2 demo1(delete      ):archive  A =======================================================
select @parameters = @parameters_Base + '' --            ,    ,  @parameters = @parameters_Base + ', @ArchiveDate datetime'
, @sql_Del = '
      delete top (50000) tc_Del 
      from  A tc_Del
      inner join tmp_Del cd on cd.ID = tc_Del.ID
'
select @sql = @sql_Part1 + @sql_Del + @sql_Part2
print @sql
exec sp_executesql @sql, @parameters, N' 2 archive  A'
-- ===== 3 demo2(delete     ):archive  B =======================================================
select @parameters = @parameters_Base + ', @ArchiveDaate datetime' --            ,    ,  @parameters = @parameters_Base + ', @ArchiveDate datetime'
, @sql_Del = '
      delete top (50000) 
      from  B
      where Date < @ArchiveDate
'
select @sql = @sql_Part1 + @sql_Del + @sql_Part2
print @sql
exec sp_executesql @sql, @parameters, N' 3 archive  B', @ArchiveDate
총결산
위 에서 말 한 것 은 소 편 이 소개 한 sql server 에서 archive 유 니 버 설 템 플 릿 스 크 립 트 를 작성 하여 자동 으로 데 이 터 를 분할 삭제 하 는 것 입 니 다.여러분 에 게 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 저 에 게 메 시 지 를 남 겨 주세요.소 편 은 제때에 답 해 드 리 겠 습 니 다!

좋은 웹페이지 즐겨찾기