이번에 FILESTREAM으로 저장된 내용을 다른 위치에 있는 곳에 복사하는 작업을 수행하게 됐다.
문제는 FILESTREAM 데이터다 보니, 실제 파일 사이즈의 데이트를 주고 받게 되서,
단순한 INSERT INTO SELECT 로는 처리할 수 없었다.
SELECT를 통해서 데이터를 수집할 때, 메모리가 Full 나버리는 안타까운 사태.

그래서 한 줄씩 읽어 밀어 넣는 방법을 쿼리로 작성해봤다.

DECLARE @AllIndex TABLE (
	id numeric(18,0)
)

DECLARE @curId numeric(18,0)

INSERT INTO @AllIndex
 SELECT [id]   
	FROM [source].[webgrab].[dbo].[TB_IMGINFO] ORDER BY id 


DECLARE CURSOR_Id CURSOR FOR
 SELECT id FROM @AllIndex


OPEN CURSOR_Id 
FETCH NEXT FROM CURSOR_Id INTO @curId

WHILE @@FETCH_STATUS = 0
BEGIN
	INSERT INTO TB_IMGINFO
		SELECT 
			[RowId]
			,[baseid]
			,[itemid]
			,[filename]
			,[fileindex]
			,[fileurl]
			,[imgdata]
			,[chgcode]
			,[chgcodeid]
		FROM 
			[source].[webgrab].[dbo].[TB_IMGINFO] 
		WHERE 
			id = @curId
		
		Print @curId

FETCH NEXT FROM CURSOR_Id INTO @curId
END

CLOSE CURSOR_Id
DEALLOCATE CURSOR_Id

ID 역할을 할만한 중첩되지 않는 값을 먼저 변수에 담고, 그 변수의 내용을 커서로 돌려, 하나씩 Insert.

기왕이면 Transaction까지 넣는다면 좋겠지만, 일단, 데이터만 옮기면 끝이라.

728x90

+ Recent posts