품목코드 일괄변경 작업을 위해 SP를 만들어 보았습니다.


방법은 품목코드 Column(ITEM_CODE)을 가지고 있는 테이블 LIST를 가져온 뒤

해당 테이블 목록을 Fetch Next로 돌리면서

기존 품목코드를 신규 품목 코드로 변경하는 내용입니다.


일단 변수 선언부분 입니다.

-- 변수 설정 --

DECLARE @FullTableName nvarchar(128)

/* 커서 오픈으로 가져오는 select 값 저장 변수 */

, @TableName nvarchar(128), @FieldName nvarchar(9)

/* Query 수행문 저장 변수 */

, @strSQL1 nvarchar(4000), @strSQL2 nvarchar(4000), @strSQL3 nvarchar(4000), @curSQL nvarchar(4000)

/* 테스트를 위한 카운트 값 */

, @i int


ITEM_CODE 컬럼이 존재하는 테이블 목록은 커서를 선언하고

FETCH NEXT FROM 구문을 이용해 총 2개의 컬럼을 select하여 가져옵니다.

1. 테이블명 nvarchar(128)

2. 컬럼명 nvarchar(9)  <-- 사실 이 항목은 쓰지 않지만 있으나 없으나 오류는 똑같은 상황입니다.


커서 선언 및 FETCH NEXT 구문은 다음과 같습니다.

-- 커서 선언 : ITEM_CODE 컬럼을 가진 모든 테이블 목록 만큼 반복 --

Set @curSQL = 'DECLARE CUR_TBL CURSOR FOR '

+ 'Select CAST(RTRIM(b.name) as nvarchar(128)) as TableName, CAST(RTRIM(a.name) as nvarchar(8)) as FieldName '

+ ' From ' + @dbName + '..syscolumns a with(nolock), ' + @dbName + '..sysobjects b with(nolock) '

+ ' Where a.id = b.id and UPPER(a.name) like ''ITEM_CODE'' and b.type = ''U'' and a.length < 512 '

+ ' ORDER BY B.name ASC';

EXEC sp_executesql @curSQL;

-- 커서를 열고 --

OPEN CUR_TBL

-- 첫행(테이블명)을 가져온다

FETCH NEXT FROM CUR_TBL INTO @TableName, @FieldName


그리고 WHILE문으로 돌려 줍니다.

While @@FETCH_STATUS = 0

BEGIN

-- 기존 품목코드 레코드를 뽑아서 신규 품목코드로 UPDATE 처리 시작 --

...

...

...

-- 기존 품목코드 레코드를 뽑아서 신규 품목코드로 UPDATE 처리 시작 --

여기까지 다 잘 처리 되었습니다. (테스트 결과 이상 없었습니다.)

그리고 마지막으로 다음 테이블 정보를 가져오기 위해 아래 구문이 수행됩니다.

FETCH NEXT FROM CUR_TBL INTO @TableName, @FieldName

END


그런데 쿼리 수행 결과를 보면

어떤 테이블은 오류 없이 품목코드 변환이 정상적으로 처리 되고

어떤 테이블은 아래와 같은 오류를 나타냅니다.


----- 오류 내용 -----

서버: 메시지 8152, 수준 16, 상태 4, 줄 1

문자열이나 이진 데이터는 잘립니다.

문이 종료되었습니다.


본 오류는 WHILE문 마지막에 들어있는

FETCH NEXT FROM CUR_TBL INTO @TableName, @FieldName 쿼리문이 수행되는 시점에서 발생하며

테이블명이나 컬럼명의 길이 값과 데이터 타입이 문제일 거라 생각하여

다음과 같은  수정을 하였습니다.


1. 데이터 길이 늘리기

데이터 길이는 현재 다음과 같이 되어 있습니다.

@TableName nvarchar(128)

@FieldName nvarchar(9)

각각의 변수를 256, 32 등으로 늘려 보았지만 문제가 해결되지 않았습니다.

커서를 선언하고 테이블명과 컬럼명을 가져와보면 테이블명이 아무리 길어봐야 25글자 이내입니다.

컬럼명은 'ITEM_CODE' 로 9글자 입니다.

2. 데이터 타입 맞추기

데이터 타입의 문제인가 싶어서 테이블명, 컬럼명 정보를 가져오는 커서 선언 부분에서

CAST를 이용해 nvarchar(128)과 nvarchar(9) 로 데이터 타입을 변환시켜 보았습니다.

하지만 문제는 여전히 해결되지 않고 같은 오류를 계속해서 냅니다.


정상 처리된 테이블명 중 하나를 뽑자면 '_INTRA_SHOPITEM_LIST' 입니다.

오류 처리된 테이블명 중 하나를 뽑자면 '_temp_carpentryPrice_data' 입니다.

두 테이블명 모두 문자길이가 25를 넘지 않습니다.


데이터 타입을 조정해주고 길이를 늘려 주었는데도 어떤 테이블은 정상 처리되고

어떤 테이블은 '문자열이나 이진 데이터는 잘립니다' 라는 오류를 내는 이유가 뭘까요?


벌써 반나절 이상을 이거땜에 끙끙 싸메고 있네요..

도움 부탁드립니다.


No. Subject Author Date Views
Notice 2023년 1월 - SQLER의 업데이트 강좌 리스트 코난(김대우) 2023.01.02 461
6989 [2번째 진행] sqlservr.exe 메모리 점유 이상 증가 현상 [1] house 2013.07.11 9126
6988 에러 코드 5144 발생 이유 [4] 재호 2013.07.11 7469
6987 DB to DB로 대용량의 데이터를 실시간으로 전송하는 방법 [2] tyzm 2013.07.10 6648
6986 SSIS 패키지 문의 드립니다. 나는짱이야 2013.07.10 4567
6985 error Oxc0202009: Data Flow Task1: SSIS Error Code DTS ..... [1] 봉이 2013.07.10 13086
6984 [문의] 평균 이용시간 구하기~? [10] 아톰 2013.07.10 9900
6983 직각가로를 검색하는 방법 아시는 분? [2] 형님 2013.07.10 5236
6982 저장 프로시저 제작 중 파라미터 값 처리에 대한 문의 드립니다. [4] 래리 2013.07.10 6147
6981 난수 update 프로시저 문의 드릴께요. [2] 3bong 2013.07.10 5708
» FETCH NEXT FROM ... 데이터 형식 및 길이 오류 [8] 래리 2013.07.09 8044
6979 mssql 2012 완전히 삭제하는 방법좀 알려주세요.. [1] 처리짱 2013.07.09 28207
6978 sql 2000 -> 2005 이전 [3] 시스템 2013.07.09 5931
6977 급.! 프로시저 실행 속도 관련 질문입니다. ㅠㅠ [2] 획~~ 2013.07.09 5643
6976 SQL 2005에서 2012로 접속이 안됩니다. [6] junQ 2013.07.09 5247
6975 여러개의 DB에 FUNCTION 일괄생성 방법 문의 [4] 방울소리007 2013.07.08 9160
6974 sp_change_user_login 사용후 디비보이지 않을때 떨거지희 2013.07.08 5247
6973 하나의 컴퓨터에 다중 sql server가 설치되었을때 db 초기화가 실패합니다. [4] 순딩순딩 2013.07.08 6263
6972 OLE DB error: OLE DB or ODBC error: Query timeout expired; HYT00 에러 관련 망토가좋아 2013.07.08 6267
6971 union all 시에 어떻게 처리해야하나요? [1] 황금용이 2013.07.08 5261
6970 IDENTITY관련... [1] 메칸더 2013.07.08 4865





XE Login