품목코드 일괄변경 작업을 위해 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 SQL강좌: 챗GPT와 함께 배우는 SQL Server 무료 강좌 목차와 소개 (2023년 9월 업데이트) 코난(김대우) 2023.08.18 1215
Notice Python 무료 강좌 - 기초, 중급, 머신러닝(2023년 6월 업데이트) 코난(김대우) 2021.01.01 1690
6997 SQL2008 로그전달 문의드립니다 맨발의청춘 2013.07.12 5095
6996 dtsx 패키지 새로운 서버로 이동 [1] 공유맨 2013.07.12 5215
6995 이너조인에서 최적화된 조건절에 대해서... [4] 화성에서왔어요 2013.07.12 5701
6994 저장프로시져에서 이럴 경우 어떻게 해줘야 하나요.... 구문을 모르겠네요? [6] 삼미슈퍼스타 2013.07.12 4742
6993 프로시져를 사용하여... SQL 서버(A)의 B 데이터베이스 ---> SQL 서버(C)의 D 데이터베이스 로 접근방법 [2] 용대가리 2013.07.12 4936
6992 클라이언트 관리자가 없나요?? [2] 클리티에 2013.07.12 4571
6991 로그에 concurrent queries. 가 나오는데요. [6] 하람v 2013.07.11 5318
6990 MSDB사이즈 축소 문의 [2] 방울소리007 2013.07.11 9168
6989 [2번째 진행] sqlservr.exe 메모리 점유 이상 증가 현상 [1] house 2013.07.11 9141
6988 에러 코드 5144 발생 이유 [4] 재호 2013.07.11 7501
6987 DB to DB로 대용량의 데이터를 실시간으로 전송하는 방법 [2] tyzm 2013.07.10 7131
6986 SSIS 패키지 문의 드립니다. 나는짱이야 2013.07.10 4575
6985 error Oxc0202009: Data Flow Task1: SSIS Error Code DTS ..... [1] 봉이 2013.07.10 13130
6984 [문의] 평균 이용시간 구하기~? [10] 아톰 2013.07.10 9935
6983 직각가로를 검색하는 방법 아시는 분? [2] 형님 2013.07.10 5244
6982 저장 프로시저 제작 중 파라미터 값 처리에 대한 문의 드립니다. [4] 래리 2013.07.10 6152
6981 난수 update 프로시저 문의 드릴께요. [2] 3bong 2013.07.10 5726
» FETCH NEXT FROM ... 데이터 형식 및 길이 오류 [8] 래리 2013.07.09 8090
6979 mssql 2012 완전히 삭제하는 방법좀 알려주세요.. [1] 처리짱 2013.07.09 28240
6978 sql 2000 -> 2005 이전 [3] 시스템 2013.07.09 5943





XE Login