안녕하세요.

SQL을 5년이 넘게 접해왔지만 아직도 초급 수준을 벗어나지 못하고 있네요...

도움을 받을 수 있을까 하여 이곳에 질문을 드립니다.


저희 회사에서 ERP 프로그램을 사용 중입니다.

이 프로그램에는 품목코드와 품목정보가 담긴 ITEM_MASTER라는 테이블이 존재합니다.

그런데 이번에 기존 품목코드 중 일부 (약 1500개) 품목코드가 새로운 품목코드로 변경 되어야 합니다.


예를들면 다음과 같습니다.

기존 품목코드 AAA-11-ABCD-00 를

신규 품목코드 BBB-12-ZZZ 로 모두 변경.


ERP에서 품목코드는 모든 프로세스의 기준이 되는 존재이므로

ITEM_MASTER (품목정보 테이블) 에서만 품목코드를 변경해선 안되고

품목코드가 존재하는 모든 테이블에서 변경사항이 적용 되어야 합니다.


때문에 SP를 만들어서 처리하고자 합니다.


일단은 DB내에 존재하는 모든 테이블에서 ITEM_CODE(품목코드 컬럼명) 컬럼이 존재하는 테이블 목록을 구한 뒤

해당 테이블들의 레코드를 가져와서 기존 품목코드를 신규 품목 코드로 변경해 주려고 합니다.


이 작업을 위해 제가 지금 정리한 내용은 다음과 같습니다.


1. 품목코드 변경 기준 테이블 EX_ITEM_MASTER 생성

   이 테이블에는 기존품목코드, 품목명, 단위, 단가, 거래처 ... 등의 정보가 있고 마지막 컬럼에 신규 품목코드 컬럼인

   NEW_CODE 컬럼이 존재합니다.


2. 품목코드 변경용 SP제작


-- 일단 ITEM_CODE 컬럼이 존재하는 모든 테이블 목록을 가져온다. --

Select b.name as TableName, a.name as FieldName, a.length 

From syscolumns a with(nolock), sysobjects b with(nolock) 

Where a.id = b.id and 

a.name like 'ITEM_CODE' and 

b.type = 'U' and a.length = 13

ORDER BY B.name ASC


위 쿼리를 이용하니 ITEM_CODE 컬럼이 존재하는 모든 테이블을 구할 수 있었습니다.

레코드 결과는 '테이블명', '필드명', '길이' 입니다.


위 레코드 결과를 LOOP 돌리면서 각 테이블마다 ITEM_SCODE 값을 가져온 뒤

만약 해당 품목코드가 EX_ITEM_MASTER(기존/신규 품목코드 정보) 테이블의 레코드와 일치하는 것이 있다면

EX_ITEM_MASTER 테이블의 NEW_CODE 값으로 UPDATE 해줍니다.


이러한 내용을 SP로 제작하여 다음과 같이 수행하고 싶습니다.


EXECUTE sp_exchange_code 'DB명'


sp 뒤에 DB명을 파라미터로 전달하는 이유는 일단 테스트 DB에서 수행해 본 뒤 실제 DB에서

수행하는 것을 구분지어 주기 위함입니다.


SP제작이 완전 생 초보라 어디서부터 손을 대야 할지 모르겠습니다.

비슷한 유형의 SP 정보나 위 조건에 따른 SP 제작을 위해 도움을 받을 수 있을까요?


긴 글 읽어 주셔서 감사합니다.


----------------------------------------------------------------------------------

추가 글

답변 기다리는 동안 제가 만들어 봤는데요...

이게 맞는건지 문제는 없는지 휴... 조언좀 부탁드릴께요.


CREATE procedure [dbo].[sp_exchange_code]

@dbName nchar(8), -- 코드변경 적용할 DB명

AS

Begin

Set NOCOUNT ON


-- 변수 설정 --

DECLARE @TableName nvarchar(32), @FieldName nchar(8), @Length int /* ITEM_CODE 존재하는 테이블 정보 */

, @strSQL nvarchar(4000) /* Query 수행문 저장 변수 */

, @curSQL nvarchar(4000) /* 커서에서 동적쿼리 사용을 위한 변수 */

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

Set @curSQL = 'DECLARE CUR_TBL CURSOR FOR '

+ ' Select b.name as TableName, a.name as FieldName, a.length '

+ ' 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_OS

-- 첫행을 읽어온다. (첫 테이블 정보)

FETCH NEXT FROM CUR_TBL INTO @TableName, @FieldName, @Length

-- 마지막 행까지 반복 (ITEM_CODE 컬럼이 존재하는 테이블 개수만큼 반복)

While @@FETCH_STATUS = 0

BEGIN

-- ITEM_CODE 기존 품목코드를 신규 품목코드로 변경

Set @strSQL = 'update ' + @dbName + '..' + @TableName + ' set ITEM_CODE = CTR.NEW_CODE from'

+ EX_ITEM_MASTER CTR '

+ ' where ' + @dbName + '..' + @TableName + '.ITEM_CODE = CTR.ITEM_CODE'

-- 다음 레코드(테이블)로 이동

FETCH NEXT FROM CUR_TBL INTO @TableName, @FieldName, @Length

END

-- 커서를 닫고 종료

CLOSE CUR_TBL

DEALLOCATE CUR_TBL

END

GO

No. Subject Author Date Views
Notice SQL강좌: 챗GPT와 함께 배우는 SQL Server 무료 강좌 목차와 소개 (2023년 9월 업데이트) 코난(김대우) 2023.08.18 20065
Notice Python 무료 강좌 - 기초, 중급, 머신러닝(2023년 6월 업데이트) 코난(김대우) 2021.01.01 12120
6978 sql 2000 -> 2005 이전 [3] 시스템 2013.07.09 5946
6977 급.! 프로시저 실행 속도 관련 질문입니다. ㅠㅠ [2] 획~~ 2013.07.09 5661
6976 SQL 2005에서 2012로 접속이 안됩니다. [6] junQ 2013.07.09 5261
6975 여러개의 DB에 FUNCTION 일괄생성 방법 문의 [4] 방울소리007 2013.07.08 9277
6974 sp_change_user_login 사용후 디비보이지 않을때 떨거지희 2013.07.08 5262
6973 하나의 컴퓨터에 다중 sql server가 설치되었을때 db 초기화가 실패합니다. [4] 순딩순딩 2013.07.08 6303
6972 OLE DB error: OLE DB or ODBC error: Query timeout expired; HYT00 에러 관련 망토가좋아 2013.07.08 6295
6971 union all 시에 어떻게 처리해야하나요? [1] 황금용이 2013.07.08 5296
6970 IDENTITY관련... [1] 메칸더 2013.07.08 4885
6969 두테이블 쿼리 문의 드립니다. [2] chs217 2013.07.07 4741
6968 파티션 테이블로 전환 및 과거 데이터 삭제 관리 방안 운스 2013.07.05 8769
6967 함수기반 인덱스(Function based index)를 어떻게 생성하는지요? [5] 김시준 2013.07.05 11489
6966 최초실행시 시간이 걸리는 문제 [3] 전념 2013.07.05 5218
6965 MSSQL200에서 MSSQL2012로 변경시 문제점 [1] 떨거지희 2013.07.05 6189
6964 (프로시저)쿼리 순서 질문이 있습니다. [2] alima 2013.07.05 5446
6963 SQL인증, Windows 인증 모두 안될때?? [1] 뷰롱이 2013.07.04 7534
6962 [질문] sql2012 와 vb 윈폼으로 cs프로그램을 만들려고 합니다. [1] 이운석 2013.07.04 6532
6961 질문드립니다. 기본 하위 카테고리 정률 후 상위 묶음단위 카테고리 정렬이 가능할까요?? [1] 권오현_276823 2013.07.04 5205
6960 서비스 브로커 전송큐에 최대한 맥스 몇개 까지 쌓여야지 전달 잘되는지 알수있나요? [1] 로쏘네리 2013.07.04 5144
» 품목코드 컬럼이 존재하는 모든 테이블에서 기존 품목코드를 신규 품목코드로 변경 [2] 래리 2013.07.04 5728





XE Login