데이터베이스 개발자 질문과 답변 게시판

데이터베이스 개발/운영 관련 질문과 답변을 올리는 게시판입니다. 궁금하신 내용을 이곳에서 문의하시면 SQLER 분들의 답변을 받으실 수 있습니다. 문의를 하실때에는 최근 작업하신 특이 사항이나, 장애 발생 전 상황을 상세히 올려 주시면 답글을 적어주시는 SQLER분들의 답변이 더 정확할 수 있으니 도움 되시길 바랍니다. 쿼리 문의일 경우, 실제 문제가 재현되는 테이블생성, 샘플데이터 생성 쿼리를 함께 올려 주시면 더 빠르고 정확한 쿼리 문의 응답이 가능합니다.

품목코드 일괄변경 작업을 위해 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
6993 프로시져를 사용하여... SQL 서버(A)의 B 데이터베이스 ---> SQL 서버(C)의 D 데이터베이스 로 접근방법 [2] 용대가리 2013.07.12 4915
6992 클라이언트 관리자가 없나요?? [2] 클리티에 2013.07.12 4560
6991 로그에 concurrent queries. 가 나오는데요. [6] 하람v 2013.07.11 5292
6990 MSDB사이즈 축소 문의 [2] 방울소리007 2013.07.11 9092
6989 [2번째 진행] sqlservr.exe 메모리 점유 이상 증가 현상 [1] house 2013.07.11 9114
6988 에러 코드 5144 발생 이유 [4] 재호 2013.07.11 7455
6987 DB to DB로 대용량의 데이터를 실시간으로 전송하는 방법 [2] tyzm 2013.07.10 6198
6986 SSIS 패키지 문의 드립니다. 나는짱이야 2013.07.10 4555
6985 error Oxc0202009: Data Flow Task1: SSIS Error Code DTS ..... [1] 봉이 2013.07.10 13071
6984 [문의] 평균 이용시간 구하기~? [10] 아톰 2013.07.10 9882
6983 직각가로를 검색하는 방법 아시는 분? [2] 형님 2013.07.10 5230
6982 저장 프로시저 제작 중 파라미터 값 처리에 대한 문의 드립니다. [4] 래리 2013.07.10 6146
6981 난수 update 프로시저 문의 드릴께요. [2] 3bong 2013.07.10 5687
» FETCH NEXT FROM ... 데이터 형식 및 길이 오류 [8] 래리 2013.07.09 8010
6979 mssql 2012 완전히 삭제하는 방법좀 알려주세요.. [1] 처리짱 2013.07.09 28155
6978 sql 2000 -> 2005 이전 [3] 시스템 2013.07.09 5923
6977 급.! 프로시저 실행 속도 관련 질문입니다. ㅠㅠ [2] 획~~ 2013.07.09 5631
6976 SQL 2005에서 2012로 접속이 안됩니다. [6] junQ 2013.07.09 5232
6975 여러개의 DB에 FUNCTION 일괄생성 방법 문의 [4] 방울소리007 2013.07.08 9095
6974 sp_change_user_login 사용후 디비보이지 않을때 떨거지희 2013.07.08 5238





XE Login