테이블 칼럼(column)의 타입을 변경하려고 하는데 재밌(?)는 현상이 있습니다...
일단 테이블을 생성한다.
create table test(
id varchar(10)
)
그리고 id의 타입을 varbinary로 변경하려하면 오류가 발생합니다.
alter table test alter column id varbinary(100)
데이터 형식 varchar을(를) varbinary(으)로 암시적으로 변환할 수 없습니다. CONVERT 함수를 사용하여 이 쿼리를 실행하십시오.
그래서 alter table test alter column id convert(varbinary(100), id) 라고 해 봤는데 역시 convert가 잘못됐다고 오류 발생.
그래서 할 수 없이 아래와 같이 합니다.
1. varbinary 임시 칼럼(id_temp) 하나 추가
2. 기존 칼럼(id) 삭제
3. sp를 사용해 임시칼럼 이름 변경(id_temp -> id)
exec sp_rename 'dbo.test.id_temp', 'id', 'column'
위 sp를 사용하면 다음과 같은 경고문구가 나온다.
주의: 개체 이름 부분을 변경하면 스크립트 및 저장 프로시저를 손상시킬 수 있습니다.
왠지 복잡한 느낌이 듭니다.. 이리저리 하다가 다음과 같은 방법을 찾았습니다. 더 간단합니다.
1. alter table test alter column id int -- int로 변경한다.
2. alter table test alter column id varbinary(100) -- int를 varbinary로 변경한다.
아주 간단합니다. 칼럼 순서도 안바뀌고.. 사실 칼럼 순서가 안바뀌는 것이 굉장히 중요합니다.
그래서 왜 varchar에서 varbinary로 집접 변환은 안되고 int를 거치면 변환이 되는지 궁금합니다.
그리고 위의 방법(추가->삭제->변경)보다 이 방법이 훨신 깔끔한데 어느 방법이 정석인지요?
sql server2005, sql server2008 둘다 동일한 현상입니다.
감사합니다.
Comment 2
-
김시준
2013.03.12 12:41
예... 안되는 형변환이네요....
감사합니다...
http://msdn.microsoft.com/ko-kr/library/ms187928.aspx
컬럼의 데이타 타입을 바꾸면 그 컬럼의 데이타들도 타입이 바뀌겠죠.
이때 암시적 형변환이 일어나는데요.
VARCHAR는 VARBINARY로 암시적 형변환이 될 수 없기 때문에 타입을 바꿀 수 없는것 같습니다.