IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'[_Object]') AND OBJECTPROPERTY(id, N'IsUserTable') = 1)
DROP TABLE [_Object]
GO
 
CREATE TABLE [dbo]._Object
(
  ID  int,
  Context varchar(128),
  Date  datetime
)
 
declare @ID     int
declare @Context  varchar(128)
 
SET @ID = 0
 
WHILE( @ID < 10000 )
BEGIN
  SET @ID = @ID + 1
  SET @Context = 'Context' + convert( varchar(10), @ID )
 
  INSERT INTO [dbo].[_Object] (ID, Context, Date) VALUES ( @ID, @Context, GETDATE() )
END
 
SELECT * FROM _Object

위와 같이 _Object 테이블을 먼저 만들면, 다음과 같은 결과가 나옵니다.

그럼 위의 Context 컬럼의 숫자를 10000부터 꺼꾸로 빼는 과정을 Cursor를 이용해서 만들겠습니다.
DECLARE cursor_Obj CURSOR FAST_FORWARD
FOR SELECT ID, Context FROM _Object
 
DECLARE @ID  int
DECLARE @Context varchar(128)
OPEN cursor_Obj
 
FETCH NEXT FROM cursor_Obj INTO @ID, @Context
WHILE (@@fetch_status = 0)
BEGIN
  UPDATE _Object SET Context = 'Context' + convert(varchar(10), 10001 - @ID)
  WHERE ID = @ID
 
  FETCH NEXT FROM cursor_Obj INTO @ID, @Context
END
 
CLOSE cursor_Obj
DEALLOCATE cursor_Obj
GO

ID 컬럼에 인덱스가 걸려있지 않아서 매우 느리고 답답합니다.
느린 실행 예제를 만들기 위한 것이므로 조금만 참아주세요. ㅎㅎ

자, 이제 언제 끝날지 모르는 Cursor 작업에 진행률 표시를 넣어봅시다.
SET NOCOUNT ON
 
---------------------------- 진행 상황 표시 관련 변수 선언 ----------------------------
DECLARE @ProcessRowCount  INT
DECLARE @ProcessCurCount  INT
DECLARE @ProcessPercentage  INT
DECLARE @ProcessPrevPercentage  INT
DECLARE @StartTime    DATETIME
DECLARE @ProcessRatio  INT
 
SET @ProcessRowCount = 0
SET @ProcessCurCount = 0
SET @ProcessPercentage = 0
SET @ProcessPrevPercentage = 0
SET @StartTime = GETDATE()
 
SET @ProcessRatio    = 10 -- Ratio 값 범위(2 - 100) : 값 1 미지원
 
SELECT  @ProcessRowCount = count('') FROM _Object WITH(NOLOCK)
---------------------------------------------------------------------------------------
 
DECLARE cursor_Obj CURSOR FAST_FORWARD
FOR SELECT ID, Context FROM _Object WITH(NOLOCK)
 
DECLARE @ID  int
DECLARE @Context varchar(128)
 
OPEN cursor_Obj
 
FETCH NEXT FROM cursor_Obj INTO @ID, @Context
WHILE (@@fetch_status = 0)
BEGIN
  ---------------------------- 진행 상황 표시 관련 변수 선언 ----------------------------
  SET @ProcessCurCount = @ProcessCurCount + 1
  SET @ProcessPercentage = (@ProcessCurCount * 100 / @ProcessRowCount)
 
  IF ( (@ProcessPercentage % @ProcessRatio) = 0 )
  BEGIN
    IF ( (@ProcessPrevPercentage % @ProcessRatio) <> (@ProcessPercentage % @ProcessRatio) )
    BEGIN
      PRINT 'Elapsed Time : ' + convert( varchar(128), GETDATE() - @StartTime, 114 )
      + ',    Processing...' + convert( varchar(4), @ProcessPercentage ) + '%'
    END
  END
 
  SET @ProcessPrevPercentage = @ProcessPercentage
  ---------------------------------------------------------------------------------------
 
  UPDATE _Object SET Context = 'Context' + convert(varchar(10), 10001 - @ID)
  WHERE ID = @ID
 
  FETCH NEXT FROM cursor_Obj INTO @ID, @Context
END
 
CLOSE cursor_Obj
DEALLOCATE cursor_Obj
GO

위와같이 쿼리를 작성하였으나... "어라! 결과 진행 상황이 안나오고 나중에 한번에 출력되는데?"

이런 의문점이 생기는 것이 당연하다.
의문점이 생기지 않았다면, 위의 쿼리를 다시 실행하고 오세요!!

해결방법 : CTRL+T 텍스트 모드로 결과 출력
이렇게 변경 후 실행하면 실시간으로 진행상황을 알 수 있다.

쿼리를 실행하면 다음과 같은 결과를 얻을 수 있다.
2008/01/31 00:35 2008/01/31 00:35

글 걸기 주소 : 이 글에는 트랙백을 보낼 수 없습니다

덧글을 달아 주세요